当我想在C#中动态调用一个静态定义的方法("静态"是指在编译时确定,而不是类级成员),我可以使用反射来获取该方法的句柄并调用它:
typeof(Foo).GetMethod("Bar").Invoke(foo, new object[] { /* params */ });
然而,通过继承DynamicObject
使对象动态化后,对于(未定义的)实例方法调用将使用TryInvokeMember
进行响应,并且类所响应的动态方法不会通过反射公开,这是显而易见的原因。这意味着我无法获取应该由TryInvokeMember
响应的方法的方法句柄。
因此,具有讽刺意味的是,在dynamic
对象上动态调用动态方法似乎并不像在非dynamic
对象上调用已定义方法那样容易。
我考虑直接调用TryInvokeMember
,但第一个参数必须是InvokeMemberBinder
的实例,这是一个抽象类。我认为,如果我必须实现一个类来调用动态对象上的动态方法,则一定做错了什么。
如何通过名称调用dynamic
对象上的方法,知道目标类没有实现它,并且应该使用TryInvokeMember
响应?