C# 铸造到Func<;T1、T2>;在已知T1和T2的运行时

C# 铸造到Func<;T1、T2>;在已知T1和T2的运行时,c#,generics,reflection,C#,Generics,Reflection,我有一本定义如下的词典 Dictionary其中对象的类型为Func 字典将各种函数存储为对象,具有不同的T1和T2。在运行时,根据传递的参数,我需要将对象类型转换为Func,但我无法这样做。我知道运行时T1和T2的类型,但还没有找到一种方法来实现这一点 有没有关于如何启动和运行的想法 最后你有一个委托(所有函数和其他委托都是委托),所以通过反射像委托一样使用它 Delegate del = (Delegate)obj; // the object contained in the dictio

我有一本定义如下的词典

Dictionary
其中对象的类型为
Func

字典将各种函数存储为对象,具有不同的
T1
T2
。在运行时,根据传递的参数,我需要将对象类型转换为
Func
,但我无法这样做。我知道运行时
T1
T2
的类型,但还没有找到一种方法来实现这一点


有没有关于如何启动和运行的想法

最后你有一个
委托
(所有
函数
和其他委托都是
委托
),所以通过反射像
委托一样使用它

Delegate del = (Delegate)obj; // the object contained in the dictionary
object par = ... // your parameter
object result = del.DynamicInvoke(par);
显然
par1
必须是“正确”类型。请注意,您的词典可以直接将
TValue
作为
Delegate
类型

Dictionary<string, Delegate> MyDictionary
字典我的字典

如果您知道所有委托都是某些
Func
的实例,当
del
是您的委托时,您可以使用
del.GetType().GetGenericTypeArguments()
查询
T1
T2

但是,由于编译器不知道词典的内容,您不能期望编译器在编译时知道T1或T2,因此我不知道您想对
T1
T2
做什么,但我能想到的大多数事情都需要一定程度的反射


因此,除非有很好的理由不这样做,我还建议使用xanatos建议的
DynamicInvoke

你有代码吗?你有代码片段吗?你可以告诉我们你是如何尝试将对象类型转换为Func的吗?你知道MakeGenericType方法吗:?把它做成
字典
,你就完成了。如果他正在构建一些(奇怪的)呢一种需要Func的表达式树?在这种情况下,委托没有用。@HimBromBeere如果他正在构建一个表达式,那么他可能可以直接传递委托。。。需要更多的代码,但是标记是
泛型
反射
,而不是
表达式
我最初有一个字典,但出于性能原因,我正试图从DynamicInvoke()转移到Invoke()。我正在尝试构建一个linq表达式,该表达式可以访问所有类属性(包括嵌套属性)@user1542794即使您想要构建表达式树,给定一个
委托del
,您也可以
expression.Call(expression.Constant(del.Target)、del.Method、parameter1)
我正在尝试从DynamicInvoke()移动到Invoke()出于性能原因。@user1542794在这种情况下,需要显示更多代码才能提出建议。您希望如何处理func委托?