2017-08-08 51 views
0

我在旧系统上进行维护,并在.Net类中找到以下实现(GetMethod只是一个硬编码示例,它来自config xml文件)。我把它改成正常的方法调用,使看它是否将工作和做:InvokeMember vs普通方法调用

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

我强烈怀疑它试图调用通常无法访问的成员,例如一个私人的。也许那个成员后来被公开了。 –

+1

我可以想象的唯一场景是什么使得任何一种意义(如在,不只是与直接调用方法相同的东西)是当类是使用继承的类型层次结构的一部分时,“ListChanges”不是虚方法,但它仍然存在于派生类中(使用'new'来映射基类)。在这种情况下,'GetType()。InvokeMember()'跳舞是调用派生方法的(可怕的)方式。除此之外,其中没有意义。也许'ListChanges'曾经是基类的私有或受保护的成员,或者开发人员可能只是想“使用它”。 –

+0

谢谢你们OP。两者都有道理。不幸的是我无法证实两者。对我来说,它看起来不必要的复杂。 InvokeMember不会因为反射而不是正常的函数调用而增加开销吗? –

回答

0

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

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

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

两个类A和B具有与方法名“ListChanges”相同的方法签名,但都没有实现接口。

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

通常我们会定义partial类并为生成的类添加接口,但可能这个代码很旧(类型化数据集很旧),在开发时并不存在partial,编写自定义代码生成器也会很多代码只是简单地调用单一方法。