隐式委托投射

时间:2012-07-28 15:47:37

标签: c# dynamic casting delegates

我想知道是否有某种方法可以将方法组,匿名方法或lambda表达式转换为System.Delegate而不知道确切的委托类型,例如

var d = ()=>{};
dynamic d = ()=>{};
Delegate d = ()=>{};

我需要一种适用于任何具有任何参数和返回类型且不使用反射的方法的方法。 谢谢你的回答。

1 个答案:

答案 0 :(得分:6)

不可能,因为委托必须具有单个定义的类型,但多个委托可以具有相同的签名。这使得委托类型不明确 - 编译器无法在这样的语句中稳健地选择适当的类型。请注意,匹配签名但不同类型的委托实例 可互换。例如,是:

i => (i % 2) == 0

Func<int,bool>还是Predicate<int>?或者是其他东西?请注意,通用艺术的数量是无关紧要的; ActionThreadStart以及MethodInvoker都只是无效的非通用无参数代理。

此外,还增加了复杂性/歧义,因为lambdas也可以编译为表达式树,而不仅仅是委托:

Func<int, bool> x = i => (i % 2) == 0;
Expression<Func<int, bool>> y = i => (i % 2) == 0;

表达式树与代表完全不同。