调用Invoke会导致参数计数不匹配

时间:2017-03-27 06:11:57

标签: c# reflection

我看过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});

...但是当我这样做时,我得到一个参数计数不匹配,我正在摸不着为什么。

是因为它是一种通用的方法,可能吗?或者Countconnection上的扩展方法的事实?

作为参考,调用我的方法的非反思,直接的方式类似于int count = connection.Count<MyRow>(new Criteria("some info here"));

2 个答案:

答案 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,它接受​​两个参数IDbConnectionICriteria

根据docsMethodInfo.Invoke的第二个参数是您传递给此方法的参数:

  

调用的方法或构造函数的参数列表。这是一个对象数组,其数量,顺序和类型与要调用的方法或构造函数的参数相同。如果没有参数,则参数应为null。

方法信息需要2个参数,但你只给了它一个。例外!

“但是当我调用该方法时,我需要说connection.Count(someCriteria)而不是Count(connection, someCriteria)!”

唯一的可能性是Count是一种扩展方法。扩展方法似乎可以在对象上调用它们。但是你可能知道,它们只是语法糖。它们本质上只是简单的旧静态方法。在进行反思时,你需要忽略语法糖,因为反思并不关心那些。