ฉันพยายามสร้างสิ่งนี้ตามคำตอบของ@Andrey Naumov อาจจะเป็นการปรับปรุงเล็กน้อย
public sealed class Lambda<S>
{
public static Func<S, T> CreateFunc<T>(Func<S, T> func)
{
return func;
}
public static Expression<Func<S, T>> CreateExpression<T>(Expression<Func<S, T>> expression)
{
return expression;
}
public Func<S, T> Func<T>(Func<S, T> func)
{
return func;
}
public Expression<Func<S, T>> Expression<T>(Expression<Func<S, T>> expression)
{
return expression;
}
}
โดยที่พารามิเตอร์ type S
เป็นพารามิเตอร์ที่เป็นทางการ (พารามิเตอร์อินพุตซึ่งเป็นขั้นต่ำที่จำเป็นในการอนุมานประเภทที่เหลือ) ตอนนี้คุณสามารถเรียกมันว่า:
var l = new Lambda<int>();
var d1 = l.Func(x => x.ToString());
var e1 = l.Expression(x => "Hello!");
var d2 = l.Func(x => x + x);
//or if you have only one lambda, consider a static overload
var e2 = Lambda<int>.CreateExpression(x => "Hello!");
คุณสามารถมีโอเวอร์โหลดเพิ่มเติมสำหรับคลาสเดียวกันAction<S>
และExpression<Action<S>>
ในทำนองเดียวกัน สำหรับอื่น ๆที่สร้างขึ้นในผู้ร่วมประชุมและการแสดงออกประเภทคุณจะต้องเขียนแยกชั้นเรียนเช่นLambda
, Lambda<S, T>
, Lambda<S, T, U>
ฯลฯ
ข้อดีของสิ่งนี้ที่ฉันเห็นจากแนวทางเดิม:
ข้อกำหนดประเภทที่น้อยกว่าหนึ่งรายการ (ต้องระบุเฉพาะพารามิเตอร์ที่เป็นทางการเท่านั้น)
ซึ่งให้อิสระแก่คุณในการใช้กับสิ่งใด ๆFunc<int, T>
ไม่ใช่แค่T
พูดstring
เมื่อใดดังที่แสดงในตัวอย่าง
รองรับการแสดงออกได้ทันที ในแนวทางก่อนหน้านี้คุณจะต้องระบุประเภทอีกครั้งเช่น:
var e = Lambda<Expression<Func<int, string>>>.Cast(x => "Hello!");
//or in case 'Cast' is an instance member on non-generic 'Lambda' class:
var e = lambda.Cast<Expression<Func<int, string>>>(x => "Hello!");
สำหรับนิพจน์
การขยายคลาสสำหรับประเภทผู้ร่วมประชุม (และนิพจน์) อื่น ๆ ก็ยุ่งยากเหมือนกันเหมือนข้างบน
var e = Lambda<Action<int>>.Cast(x => x.ToString());
//or for Expression<Action<T>> if 'Cast' is an instance member on non-generic 'Lambda' class:
var e = lambda.Cast<Expression<Action<int>>>(x => x.ToString());
ในแนวทางของฉันคุณต้องประกาศประเภทเพียงครั้งเดียว (ซึ่งน้อยเกินไปสำหรับFunc
s)
อีกวิธีหนึ่งในการนำคำตอบของ Andrey ไปใช้ก็เหมือนกับว่าจะไม่เป็นแบบทั่วไป
public sealed class Lambda<T>
{
public static Func<Func<T, object>, Func<T, object>> Func = x => x;
public static Func<Expression<Func<T, object>>, Expression<Func<T, object>>> Expression = x => x;
}
ดังนั้นสิ่งต่างๆจึงลดลงเป็น:
var l = Lambda<int>.Expression;
var e1 = l(x => x.ToString());
var e2 = l(x => "Hello!");
var e3 = l(x => x + x);
แม้จะพิมพ์น้อยลง แต่คุณสูญเสียความปลอดภัยบางประเภทและimo ก็ไม่คุ้มค่า