gpt4 book ai didi

C# 4.0 - 在动态对象调用 TryInvokeMember() 时调用 protected 方法吗?

转载 作者:太空狗 更新时间:2023-10-29 23:11:34 26 4
gpt4 key购买 nike

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

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

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

我想知道的是,当尝试从定义类外部调用 protected 方法时,是否调用了 TryInvokeMember()。

我将此行为与 PHP 进行对比,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

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

关于C# 4.0 - 在动态对象调用 TryInvokeMember() 时调用 protected 方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2382821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com