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