আমি @ অ্যান্ড্রে নুমভের জবাবের ভিত্তিতে এটি তৈরির চেষ্টা করেছি । এটি একটি সামান্য উন্নতি হতে পারে।
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!");
আপনি অতিরিক্ত overloads থাকতে পারে 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);
এটি এমনকি টাইপিংও কম, তবে আপনি নির্দিষ্ট ধরণের সুরক্ষা এবং ইমো হারাবেন এটি উপযুক্ত নয়।