基本委托示例

时间:2016-04-08 22:59:56

标签: c# reflection delegates

我和代表们一起玩,但我显然没有抓到基本的东西。

我有以下内容:

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,没有参数?这看起来与后一个代码相同。

1 个答案:

答案 0 :(得分:3)

您首先绕过了使用该委托的全部原因。根据经验,不要触摸 Method

MethodInfo.Invoke中的第一个参数是this实例。这可以是null或其他东西(例如闭包,或当委托代表实例方法时的实际对象实例),但它永远是委托实例 - 不是没有任何意义。

在你的情况下,它确实是一个闭包实例。但是你没有引用委托之外的闭包 - 它是由编译器在场景后面创建的。因此,使用MethodInfo)进行调用的唯一正确方法是foo.Method.Invoke(foo.Target, null);。当然,这完全是多余的 - 只要像任何理智的人一样使用foo();,你会没事的。)

同样,停止使用旧的委托语法。这样做没什么意义。一个简单的

Func<bool> foo = () => true;
Console.WriteLine(foo());

会正常工作。如果确实需要,您可以将自己的代理替换为Func<bool>,但现在使用自定义代理并不是很有用。