5

在 C# 4.0 中,有一个新的 DynamicObject。

它提供了一个“神奇的方法” TryInvokeMember() ,当尝试调用不存在的方法时会调用该方法。

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.tryinvokemember%28VS.100%29.aspx

我想知道的是 TryInvokeMember() 在尝试从定义类外部调用受保护的方法时是否被调用。

我将这种行为与 PHP 进行了对比,在这种情况下,它确实调用了其等效的“魔术方法”__call()。

4

1 回答 1

6

当您编写将调用不可访问的方法(使用标准 C# 访问规则)的调用时,将不会调用不可访问的方法并且运行时将调用TryInvokeMember(您可以在其中以其他方式处理调用) . 这是一个示例,您可以尝试一下:

class Test : DynamicObject {
  public void Foo() {
    Console.WriteLine("Foo called");
  }
  protected void Bar() {
    Console.WriteLine("Bar called");
  }

  public override bool TryInvokeMember
      (InvokeMemberBinder binder, object[] args, out object result) {
    Console.WriteLine("Calling: " + binder.Name);
    return base.TryInvokeMember(binder, args, out result);
  }
}

现在,我们可以创建对象的一个​​实例并尝试调用它的一些方法:

dynamic d = new Test();
d.Foo(); // this will call 'Foo' directly (without calling 'TryInvokeMember')
d.Bar(); // this will call 'TryInvokeMember' and then throw exception

因此,如果调用 的base实现TryInvokeMember,C# 动态绑定器将在调用不可访问的方法时失败,但您可以定义自己的情况处理TryInvokeMember(通过将 设置result为某个值并返回true)。

于 2010-03-04T23:08:27.160 回答