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
提供一定的约束力的约束上,但看着这我不明白为什么这会改善代码而不是普通的方法调用?
我强烈怀疑它试图调用通常无法访问的成员,例如一个私人的。也许那个成员后来被公开了。 –
我可以想象的唯一场景是什么使得任何一种意义(如在,不只是与直接调用方法相同的东西)是当类是使用继承的类型层次结构的一部分时,“ListChanges”不是虚方法,但它仍然存在于派生类中(使用'new'来映射基类)。在这种情况下,'GetType()。InvokeMember()'跳舞是调用派生方法的(可怕的)方式。除此之外,其中没有意义。也许'ListChanges'曾经是基类的私有或受保护的成员,或者开发人员可能只是想“使用它”。 –
谢谢你们OP。两者都有道理。不幸的是我无法证实两者。对我来说,它看起来不必要的复杂。 InvokeMember不会因为反射而不是正常的函数调用而增加开销吗? –