2017-03-27 35 views
2

我看过其他问题,如this,但我没有运气。我觉得我在回答中跳舞。调用调用导致参数计数不匹配

myMethod --> Int32 Count[MyClass](System.Data.IDbConnection, ICriteria) 

...我尝试调用它像这样使用调用:

使用反射来调用MethodInfo myMethod = MakeGenericMethod(Type.GetType(MyClass))我有一个MethodInfo对象,看起来像这样在调试后

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

该方法是一个扩展方法的无反射,简单明了的方式,所以不是类的一部分。的Invoke第一个参数应该是null(它甚至可以被非空,但是它会被忽略)

int count = (int)myMethod.Invoke(null, new object [] { connection, myCriteria }); 
+0

非常感谢你,你的建议效果很好。扩展方法位在我的眼睛上玩弄技巧。 – jkj2000

1

正如你所说,该方法的信息是这样的:

myMethod --> Int32 Count[MyClass](System.Data.IDbConnection, ICriteria) 

它返回一个它接受两个参数IDbConnectionICriteria

按照docsMethodInfo.Invoke第二个参数是你传递给此方法的参数:

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

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

“但是当我打电话给我的方法时,我需要说connection.Count(someCriteria)而不是Count(connection, someCriteria)!”

唯一的可能性是Count是一种扩展方法。扩展方法好像可以在对象上调用它们。但正如你所知,它们只是语法糖。它们本质上只是普通的静态方法。在做反思时,你需要忽略语法糖,因为反思并不关心这些。

相关问题