Ich muss einen offenen Delegaten (bei dem das Ziel nicht angegeben ist) effizient in einen geschlossenen Delegaten umwandeln. Ich habe meinen Code profiliert, und die Kosten für die Verwendung von CreateDelegate()
um einen geschlossenen Delegaten für eine Instanzmethode zu erzeugen, macht einen beträchtlichen Teil (>60%) der Gesamtlaufzeit aus (da dies für jede neue Instanz des Typs geschieht).
Einige grundlegende Informationen über offene und geschlossene Delegierte sind beschrieben auf der MSDN-Website in der Dokumentation für CreateDelegate
.
Mein derzeitiger Ansatz ist es, einen Weg zu finden, um den offenen Delegaten zwischenzuspeichern (so dass die Kosten für die Erstellung es nur einmal angefallen ist) und rufen Sie es mit einer anderen Methode, die die implizite "this" Parameter an den Delegaten liefert.
Ein komplizierender Faktor ist, dass ich die Signatur der Methode nicht kenne, die der Delegat zur Kompilierungszeit darstellen wird, außer durch einen generischen Parameter im Code. Darüber hinaus möchte ich Reflexion vermeiden (z.B. Invoke()
y DynamicInvoke()
), da sie in Bezug auf die Leistung nicht besser sind.
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...
Ich habe bereits den Artikel von Jon Skeet über Reflexion zum Fliegen bringen und Delegierte erforschen Da ich die Delegatensignatur nicht im Voraus kenne, sehe ich leider keine Möglichkeit, den dort beschriebenen Ansatz anzupassen.
Für jede Hilfe wären wir dankbar.