オープンデリゲート(ターゲットが指定されていないデリゲート)を効率的にクローズドデリゲートに変換する必要があります。私は自分のコードをプロファイリングしており、CreateDelegate()
を使用してインスタンスメソッドのクローズドデリゲートを作成するコストは、実行時間全体の60%を超えるかなりの部分を占めています(タイプの新しいインスタンスごとに発生します)。オープンデリゲートとクローズデリゲート間の変換を行う方法
CreateDelegate
のドキュメントでは、オープンデリゲートとクローズデリゲートに関する基本情報の一部はdescribed on the MSDN siteです。
私の現在のアプローチは、オープンデリゲートをキャッシュする方法を見つけることです(そのため、作成コストはたった1回しか発生しません)。暗黙の「this」パラメータをデリゲートに提供する別のメソッドを使用して呼び出します。
複雑な要因は、デリゲートがコードのジェネリックパラメータ以外のコンパイル時に表すメソッドのシグネチャがわからないことです。また、パフォーマンスの面で優れているため、反射を避けたい(例:Invoke()
とDynamicInvoke()
)。
static TDel CreateOpenDelegate<TDel>(MethodInfo mi)
{
// creates and returns an open delegate for a delegate of signature TDel
// that will invoke some method as described by MethodInfo {mi}
return (TDel)(object)Delegate.CreateDelegate(typeof(TDel), mi);
}
// simplification of some other code...
// Note that Action<T> is a sample usage, the actual delegate signature and
// invocation parameters vary, and are defined by the consumers of my code
private Action<T> myAction = CreateOpenDelegate<Action<U,T>>(someMethodInfo);
myAction(this, default(T)); // can't do this since {this} is a hidden parameter...
私はすでに、私は事前にデリゲートのシグネチャを知らないために、私はそこに記載されているアプローチを適応させる方法が表示されない、残念ながら、Making Reflection Fly and Exploring Delegatesのジョンスキートの記事を読みました。
ご協力いただければ幸いです。
残念ながら、私は事前にメソッドシグネチャを知らないので、このようにパラメータを明示的にカレーすることはできません。アクション<>は、自分のコードのコンシューマによって定義された任意のデリゲートにすることができます。 – LBushkin
そうなら、どんなデリゲートタイプにカレーしますか?または、2つのジェネリックパラメータ> – SLaks