gpt4 book ai didi

c# - 如何在动态对象上动态调用方法?

转载 作者:IT王子 更新时间:2023-10-29 04:49:10 24 4
gpt4 key购买 nike

当我想在 C# 中的任何对象上动态调用静态定义(“静态”的意思是“在编译时确定”,而不是“类级成员”的意思)时,我可以使用反射获取该方法的句柄并调用它:

typeof(Foo).GetMethod("Bar").Invoke(foo, new object[] { /* params */ });

但是,对象通过继承自 DynamicObject 而动态化使用 TryInvokeMember 响应(未定义的)实例方法调用,并且类响应的动态方法没有通过反射公开,原因很明显。这意味着我无法获得应由 TryInvokeMember 响应的方法的方法句柄。 .

具有讽刺意味的是,在我看来你不能在 dynamic 上动态调用动态方法对象就像您可以在非 dynamic 上调用定义的方法一样容易对象。

我考虑过调用 TryInvokeMember直接,但第一个参数必须是 InvokeMemberBinder 的实例,一个抽象类。我觉得如果我必须实现一个类来调用动态对象上的动态方法,我一定做错了什么。

如何在 dynamic 上调用方法对象的名称,知道目标类没有实现它并且应该使用 TryInvokeMember 来响应它?

最佳答案

我有一个开源(Apache 许可)框架 Dynamitey(在 nuget 中可用),它封装了动态 Binder 代码,这包括自动缓存调用站点。它也为每种类型的 Binder (getters、setters、事件、索引器、运算符、转换)提供了方便的方法,但你特别想要 InvokeMember .

当调用类的静态定义(编译时)成员时,动态绑定(bind)器代码实际上比反射(摊销)运行得更快。

Dynamic.InvokeMember(foo,"Bar",arg...);

关于c# - 如何在动态对象上动态调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13714295/

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