我看过其他类似的问题,但没有运气。 我觉得我正在围绕答案跳舞。
使用反射调用MethodInfo myMethod = MakeGenericMethod(Type.GetType(MyClass))
后,我在调试器中有一个如下所示的MethodInfo
对象:
myMethod --> Int32 Count[MyClass](System.Data.IDbConnection, ICriteria)
。我尝试使用调用来这样称呼它:
ICriteria myCriteria = new Criteria("some info here");
//'connection' is an object of type System.Data.IDBConnection
int count = (int)myMethod.Invoke(connection, new object [] {myCriteria});
。但是当我这样做时,我得到参数计数不匹配,我对原因挠头。
可能是因为它是一种通用方法吗? 或者也许Count
是connection
上的扩展方法?
作为参考,调用我的方法的非反思性、直截了当的方式类似于int count = connection.Count<MyRow>(new Criteria("some info here"));
该方法是一个扩展方法,因此它不是类的一部分。Invoke
的第一个参数应该是null
的(它甚至可以是非空的,但它会被忽略)
int count = (int)myMethod.Invoke(null, new object [] { connection, myCriteria });
正如您所说,方法信息如下所示:
myMethod --> Int32 Count[MyClass](System.Data.IDbConnection, ICriteria)
它返回一个int
并接受两个参数IDbConnection
和ICriteria
。
根据文档,MethodInfo.Invoke
的第二个参数是你传递给此方法的参数:
调用的方法或构造函数的参数列表。这是一个对象数组,其数量、顺序和类型与要调用的方法或构造函数的参数相同。如果没有参数,则参数应为 null。
方法信息需要 2 个参数,但您只给了它一个。例外!
"但是当我调用方法时,我需要说connection.Count(someCriteria)
而不是Count(connection, someCriteria)
!">
唯一的可能性是Count
是一种扩展方法。扩展方法似乎可以在对象上调用它们。但你可能知道,它们只是句法糖。它们本质上只是普通的旧静态方法。在进行反射时,您需要忽略句法糖,因为反射不关心这些。