我想知道是否有某种方法可以在不知道确切委托类型的情况下将方法组、匿名方法或 lambda 表达式转换为 System.Delegate,例如
var d = ()=>{};
dynamic d = ()=>{};
Delegate d = ()=>{};
我需要一种适用于具有任何参数和返回类型且不使用反射的任何方法的方法。感谢您的回答。
不,这是不可能的,因为一个委托必须有一个定义的类型,但多个委托可以有相同的签名。这使得委托类型模棱两可——编译器无法在这样的语句中稳健地选择适当的类型。请注意,匹配签名但不同类型的委托实例不可互换。例如,是:
i => (i % 2) == 0
一个Func<int,bool>
,还是一个Predicate<int>
?或者是其他东西?请注意,通用艺术的数量无关紧要;an Action
and ThreadStart
andMethodInvoker
都是无效的非泛型无参数委托。
此外,还有一个额外的复杂性/歧义,因为 lambdas 也可以编译为表达式树,而不仅仅是委托:
Func<int, bool> x = i => (i % 2) == 0;
Expression<Func<int, bool>> y = i => (i % 2) == 0;
表达式树与代表完全不同。