当我想在 C# 中的任何对象上动态调用静态定义的(“静态”是指“在编译时确定”的意义上,而不是“类级成员”的意义上)方法时,我可以使用反射获取该方法的句柄并调用它:
typeof(Foo).GetMethod("Bar").Invoke(foo, new object[] { /* params */ });
然而,对象通过继承而变得动态DynamicObject
使用响应(未定义)实例方法调用TryInvokeMember
,并且由于显而易见的原因,类响应的动态方法不会通过反射公开。这意味着我无法获取应通过以下方式响应的方法的方法句柄TryInvokeMember
.
具有讽刺意味的是,在我看来,你不能动态地调用动态方法dynamic
对象就像在非对象上调用定义的方法一样容易dynamic
object.
我考虑过打电话TryInvokeMember
直接,但第一个参数必须是一个实例InvokeMemberBinder
,一个抽象类。我觉得如果我必须实现一个类来调用动态对象上的动态方法,我一定做错了什么。
我怎样才能调用一个方法dynamic
通过名称来了解对象,知道目标类确实not实施它并且应该使用它来响应TryInvokeMember
?
我有一个开源(Apache 许可证)框架 Dynamitey(在 nuget 中提供),它封装了动态绑定器代码,其中包括自动缓存调用站点。它也为每种类型的绑定器提供了方便的方法(getter、setter、事件、索引器、运算符、转换),但是您特别想要调用成员 https://github.com/ekonbenefits/dynamitey/wiki/UsageReallyLateBinding#dynamic-dynamicinvokegetobject-target-string_or_invokemembername-name.
当调用类的静态定义(在编译时)成员时,动态绑定器代码实际上比反射(摊销)运行得更快。
Dynamic.InvokeMember(foo,"Bar",arg...);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)