मैंने @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;
}
}
जहां प्रकार पैरामीटर 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
एस के लिए कम )।
एंड्री के जवाब को लागू करने का एक और तरीका पूरी तरह से सामान्य नहीं है
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, यह इसके लायक नहीं है।