在 C# 4.0 中,有一个新的 DynamicObject。
它提供了一个“神奇的方法” TryInvokeMember() ,当尝试调用不存在的方法时会调用该方法。
我想知道的是 TryInvokeMember() 在尝试从定义类外部调用受保护的方法时是否被调用。
我将这种行为与 PHP 进行了对比,在这种情况下,它确实调用了其等效的“魔术方法”__call()。
在 C# 4.0 中,有一个新的 DynamicObject。
它提供了一个“神奇的方法” TryInvokeMember() ,当尝试调用不存在的方法时会调用该方法。
我想知道的是 TryInvokeMember() 在尝试从定义类外部调用受保护的方法时是否被调用。
我将这种行为与 PHP 进行了对比,在这种情况下,它确实调用了其等效的“魔术方法”__call()。
当您编写将调用不可访问的方法(使用标准 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
)。