2017-03-27 26 views
2

私はthisのような他の質問を見たことがあるが、運がない。私は答えの周りに踊っているように感じる。呼び出しを呼び出すとパラメータの数が一致しない

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にあるという事実?参考のため

、私のメソッドを呼び出すの非反射、straighforwardの方法は、メソッドが拡張メソッドなので、それはクラスの一部ではないことint count = connection.Count<MyRow>(new Criteria("some info here"));

答えて

2

ようなものになるだろう。

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

それを返す:あなたが言ったようInvokeの最初のパラメータは、メソッドの情報は次のようになり、null(それも非nullになることができますが、それは無視されます)

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

ありがとうございました。あなたの提案は素晴らしいものでした。拡張メソッドのビットが私の目で戯れました。 – jkj2000

1

する必要がありますintであり、2つのパラメータIDbConnectionICriteriaを受け入れます。

呼び出されたメソッドまたはコンストラクタの引数リスト:

docsによると、MethodInfo.Invokeの2番目のパラメータは、あなたがこのメソッドに渡すパラメータです。これは、呼び出されるメソッドまたはコンストラクタのパラメータと同じ番号、順序、および型を持つオブジェクトの配列です。パラメータがない場合、パラメータはnullにする必要があります。

メソッド情報には2つのパラメータが必要ですが、1つだけ与えました。例外!

"私が方法を呼び出すと、Count(connection, someCriteria)の代わりにconnection.Count(someCriteria)と言う必要があります!"

唯一の可能性は、Countが拡張メソッドです。拡張メソッドは、オブジェクトに対して呼び出すことができるようです。しかし、あなたが知っているように、それらはただ構文的な砂糖です。それらは本質的に単純な古い静的メソッドです。リフレクションを行うときにはシンタックス・シュガーを無視する必要があります。なぜなら、リフレクションはそれらを気にしないからです。

関連する問題