リフレクションを使用してメソッドを呼び出そうとしています。
このようなもの:
method.Invoke(instance, propValues.ToArray())
問題は、パラメーターの配列が正しい順序であることを確認する方法がないことです。どのパラメータにどの値が入るかを名前で特定する方法はありますか? それとも、本当にカスタム バインダーを作成する必要がありますか? もしそうなら、誰かが私を正しい方向に導くことができますか?
リフレクションを使用してメソッドを呼び出そうとしています。
このようなもの:
method.Invoke(instance, propValues.ToArray())
問題は、パラメーターの配列が正しい順序であることを確認する方法がないことです。どのパラメータにどの値が入るかを名前で特定する方法はありますか? それとも、本当にカスタム バインダーを作成する必要がありますか? もしそうなら、誰かが私を正しい方向に導くことができますか?
どのパラメータにどの値が入るかを名前で特定する方法はありますか?
パラメータ順に指定します。したがって、特定の値を特定の名前にマップする場合は、パラメーター リストをフェッチして、method.GetParameters
そのようにマップする必要があります。たとえば、次Dictionary<string, object>
のパラメータを使用した場合:
var arguments = method.GetParameters()
.Select(p => dictionary[p.Name])
.ToArray();
method.Invoke(instance, arguments);
編集:この回答は、パラメーター名ではなくパラメータータイプに焦点を当てています。コードが難読化されている(または異なるパラメーター名を持っている)場合、JonSkeetが提供したソリューションをマッピングすることは困難になります。
とにかく、私はこれでたくさん遊んでいました....これは私にとって最もうまくいくものです(パラメータ名を知らなくても):
public object CallMethod(string method, params object[] args)
{
object result = null;
// lines below answers your question, you must determine the types of
// your parameters so that the exact method is invoked. That is a must!
Type[] types = new Type[args.Length];
for (int i = 0; i < types.Length; i++)
{
if (args[i] != null)
types[i] = args[i].GetType();
}
MethodInfo _method = this.GetType().GetMethod(method, types);
if (_method != null)
{
try
{
_method.Invoke(this, args);
}
catch (Exception ex)
{
// instead of throwing exception, you can do some work to return your special return value
throw ex;
}
}
return result;
}
したがって、上記の関数を呼び出すことができます。
object o = CallMethod("MyMethodName", 10, "hello", 'a');
上記の呼び出しは、一致する署名を使用してこのメソッドを呼び出すことができるはずです。
public int MyMethodName(int a, string b, char c) {
return 1000;
}
上記の例は' this
'の範囲内であることに注意してください