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



我看过其他类似的问题,但没有运气。 我觉得我正在围绕答案跳舞。

使用反射调用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});

。但是当我这样做时,我得到参数计数不匹配,我对原因挠头。

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

作为参考,调用我的方法的非反思性、直截了当的方式类似于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并接受两个参数IDbConnectionICriteria

根据文档,MethodInfo.Invoke的第二个参数是你传递给此方法的参数:

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新