グーグルでSOに着陸し、この他の質問を読んだ後
コンパイル時にパラメーターの数や型がわからなかった場合、MethodInfo から正しいデリゲートを作成することは可能ですか?
詳細: これは、Reflection.Emit または型ビルダーを使用せずにエレガントに実行できますか?
Delegate.CreateDelegate では、最初のパラメーターとして正しいデリゲート型を指定する必要があるため、これは私にとっては残念なことです。そうしないと、例外がスローされたり、不適切なメソッドが呼び出されたりします。
私はいくつかの忍者ギアを構築していますが、これは非常に役立ちます.ありがとう!
一般的な解決策は次のとおりです。
/// <summary>
/// Builds a Delegate instance from the supplied MethodInfo object and a target to invoke against.
/// </summary>
public static Delegate ToDelegate(MethodInfo mi, object target)
{
if (mi == null) throw new ArgumentNullException("mi");
Type delegateType;
var typeArgs = mi.GetParameters()
.Select(p => p.ParameterType)
.ToList();
// builds a delegate type
if (mi.ReturnType == typeof(void)) {
delegateType = Expression.GetActionType(typeArgs.ToArray());
} else {
typeArgs.Add(mi.ReturnType);
delegateType = Expression.GetFuncType(typeArgs.ToArray());
}
// creates a binded delegate if target is supplied
var result = (target == null)
? Delegate.CreateDelegate(delegateType, mi)
: Delegate.CreateDelegate(delegateType, target, mi);
return result;
}
注: 私は、同じ Silverlight [ScriptableMember] メソッドを呼び出す複数の Javascript インターフェイスを持つ、何年も前に構築された JavaScript アプリケーションを置き換える Silverlight アプリケーションを構築しています。
新しい機能にアクセスするための新しいインターフェイスだけでなく、これらのすべてのレガシー JS インターフェイスもサポートする必要があるため、JS インターフェイスを自動的にセットアップし、適切な Silverlight メソッドへの呼び出しを「委譲」するものは、作業を大幅に高速化するのに役立ちます。
ここにコードを投稿することはできないので、それが要約です。