gpt4 book ai didi

c# - 使用泛型指定 lambda 表达式但具有模板化类型

转载 作者:太空宇宙 更新时间:2023-11-03 18:31:33 31 4
gpt4 key购买 nike

我有一个有趣的问题要问大家。

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

关于c# - 使用泛型指定 lambda 表达式但具有模板化类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21391853/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com