我看过this之类的其他问题,但我没有运气。我觉得我正在围着答案跳舞。
使用反射来调用MethodInfo myMethod = MakeGenericMethod(Type.GetType(MyClass))
后,我在调试器中看到了一个MethodInfo
对象:
myMethod --> Int32 Count[MyClass](System.Data.IDbConnection, ICriteria)
...我尝试使用Invoke来调用它:
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"));
答案 0 :(得分:6)
该方法是一种扩展方法,因此它不是该类的一部分。 Invoke
的第一个参数应该是null
(它甚至可以是非空的,但会被忽略)
int count = (int)myMethod.Invoke(null, new object [] { connection, myCriteria });
答案 1 :(得分:1)
正如您所说,方法信息如下所示:
myMethod --> Int32 Count[MyClass](System.Data.IDbConnection, ICriteria)
它返回int
,它接受两个参数IDbConnection
和ICriteria
。
根据docs,MethodInfo.Invoke
的第二个参数是您传递给此方法的参数:
调用的方法或构造函数的参数列表。这是一个对象数组,其数量,顺序和类型与要调用的方法或构造函数的参数相同。如果没有参数,则参数应为null。
方法信息需要2个参数,但你只给了它一个。例外!
“但是当我调用该方法时,我需要说connection.Count(someCriteria)
而不是Count(connection, someCriteria)
!”
唯一的可能性是Count
是一种扩展方法。扩展方法似乎可以在对象上调用它们。但是你可能知道,它们只是语法糖。它们本质上只是简单的旧静态方法。在进行反思时,你需要忽略语法糖,因为反思并不关心那些。