我和代表们一起玩,但我显然没有抓到基本的东西。
我有以下内容:
class Test
{
delegate bool Foo();
public void Run()
{
Delegate foo = new Foo((delegate () { return true; }));
bool result = (bool)foo.Method.Invoke(foo, null);
}
}
Test test = new Test();
test.Run();
在上面的示例中,我遇到一个异常:“对象与目标类型不匹配。”
以下工作正常:
class Test
{
delegate bool Foo();
public void Run()
{
Foo foo = new Foo((delegate () { return true; }));
bool result = foo.Invoke();
}
}
Test test = new Test();
test.Run();
我的第一次实施有什么不对?我不应该调用foo的方法,如foo,没有参数?这看起来与后一个代码相同。
答案 0 :(得分:3)
您首先绕过了使用该委托的全部原因。根据经验,不要触摸 Method
。
MethodInfo.Invoke
中的第一个参数是this
实例。这可以是null
或其他东西(例如闭包,或当委托代表实例方法时的实际对象实例),但它永远是委托实例 - 不是没有任何意义。
在你的情况下,它确实是一个闭包实例。但是你没有引用委托之外的闭包 - 它是由编译器在场景后面创建的。因此,使用MethodInfo
)进行调用的唯一正确方法是foo.Method.Invoke(foo.Target, null);
。当然,这完全是多余的 - 只要像任何理智的人一样使用foo();
,你会没事的。)
同样,停止使用旧的委托语法。这样做没什么意义。一个简单的
Func<bool> foo = () => true;
Console.WriteLine(foo());
会正常工作。如果确实需要,您可以将自己的代理替换为Func<bool>
,但现在使用自定义代理并不是很有用。