指定されたパラメーターが正しい順序であることがわかっている場合は、各パラメーターがその位置の署名の型から割り当て可能かどうかを確認できます。それほど悪いことではありません。
public static MethodInfo CallMethod(MethodInfo[] candicateMethods, object instance, object[] parameters)
{
foreach (var method in candicateMethods)
{
if (CallMethod(method, instance, parameters))
return method;
}
return null;
}
private static bool CallMethod(MethodInfo method, object instance, object[] parameters)
{
if (method.GetParameters().Length == parameters.Length
&& method.GetParameters()
.Zip(parameters, (a, b) => new
{
Signature = a.ParameterType,
Candidate = b.GetType()
})
.All(pair => pair.Signature.IsAssignableFrom(pair.Candidate)))
{
method.Invoke(instance, parameters);
return true;
}
return false;
}
out/ref/params/etc も処理する必要がある場合。署名では、はるかに複雑になります。
パラメータが正しい順序になっていない場合は、順列ごとにZip
/を試行する必要があります(ブランチ全体をカットする可能性があります。バックトラッキング アルゴリズムを使用すると簡単ですが、それでも非常に時間がかかる可能性があります)。All
parameters