InvokeMember与普通方法调用

时间:2017-08-08 07:40:57

标签: c#

我正在对遗留系统进行维护,并在.Net类中找到以下实现(GetMethod只是一个硬编码示例。这来自config xml文件)。我已将其更改为正常的方法调用,以查看它是否可行并执行:

GetMethod = "ListChanges";

DataSet dsData = null;
Type currType = GetType();
dsData = currType.InvokeMember(GetMethod, 
         BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, 
                 null, 
                 this, 
                 new object[] {oWS}) as DataSet;

VS

DataSet dData = ListChanges(<Some class> var); //ListChanges defined in the class!!

我已经读过InvokeMember提供了某些绑定约束,但是看看这是什么我无法理解为什么这会改进代码而不是正常的方法调用?

1 个答案:

答案 0 :(得分:0)

这是没有接口的相同方法名称模式的情况。您有多个编译器生成的类(来自Typed DataSet等),

class A {
    public Changes ListChanges(Object a){
      ...
    }
}

class B {
    public Changes ListChanges(Object a){
      ...
    }
}

A类和B类具有相同的方法签名,方法名称为&#34; ListChanges&#34;但两者都没有实现接口。

开发人员可能已经通过使用反射来有效地调用方法,假设您可以轻松地使用此方法而不必担心类型。

通常我们会定义partial类并为生成的类添加接口,但可能这段代码很旧(类型化数据集很旧),partial在开发和编写时不存在自定义代码生成器对于简单地调用单个方法的代码来说太过分了。