我有一个有趣的问题要问大家。
public Func<T, int> GetLambdaFor<T>()
{
// ....
}
public void SetLambdaForAnyType(Func<?, int> lambda)
{
// ....
}
在上面的代码示例中,我想知道是否可以在 C#
中指定一个可替换的 Generic
lambda expression
使用 SET 方法,同时使用 GET 方法检索特定类型的 Generic
lambda 表达式
。
所以让我举个例子(当然它有损坏的C#
,我想看看是否可行,如果可行,如何实现):
MyClass.SetLambdaForAnyType<?>((a) => new SomeValueGenerator<?>(a).GetValue());
int generateValue = MyClass.GetLambdaFor<string>()("blah");
generateValue = MyClass.GetLambdaFor<DateTime>()(DateTime.Now);
// etc...
我希望它现在更有意义。有任何想法吗?如果不可能,还有其他可能吗?
lambda 表达式不能引入泛型参数,它没有语法。您将不得不使用泛型方法而不是 lambda,并使用反射为特定类型构造封闭的泛型方法,如下所示(代码未测试):
public Func<T, int> GetLambdaFor<T> ()
{
return GetLambdaFor<T> (m_method, m_target) ;
}
public void SetLambdaForAnyType (Func<object, int> lambda)
{
if (lambda == null) throw new ArgumentNullException ("lambda") ;
// delegate complicated signature checks to CLR
try
{
var definition = lambda.Method.GetGenericMethodDefinition () ;
GetLambdaFor<Dummy> (definition, lambda.Target) ;
m_method = definition ;
m_target = lambda.Target ;
}
catch (Exception e)
{
throw new ArgumentException ("lambda", e) ;
}
}
private sealed class Dummy {}
private MethodInfo m_method ;
private object m_target ;
static Func<T, int> GetLambdaFor<T> (MethodInfo method, object target)
{
return (Func<T, int>) Delegate.CreateDelegate (typeof (Func<T, int>),
target, method.MakeGenericMethod (typeof (T))) ;
}
然后你就这样使用它
// in your class
private static int GetValueFromGenerator<T> (T a)
{
return new SomeValueGenerator<T> (a).GetValue () ;
}
MyClass.SetLambdaForAnyType (GetValueFromGenerator) ;
最后,如果你的“lambdas”总是这种形式,你可能想为 GetValue
引入一个接口(interface),而不是即时创建泛型方法,而是为这些创建泛型类型生成器,激活它们并转换为 IGetValue
。
我是一名优秀的程序员,十分优秀!