Delegate.CreateDelegate vs DynamicMethod vs Ausdruck
Fragen über Machen Reflexion Fliegen und erkunden die Delegierten...
Wenn ich brauche zu erstellen Delegierten Func<T, TResult>
auf Methoden auf, die dynamisch geladen werden Arten ich konnte potenziell verwenden (1) Delegate.CreateDelegate
(2) DynamicMethod
(3) Expression
Bäume.
Lets sagen, dass der Satz von dynamisch geladenen Typen/Methoden reflektiert werden einmal beim Start der Anwendung über config und verwendet während der gesamten Lebensdauer der app (start-up-Leistung ist nicht ein Problem, und weder Speicher), die Delegierten werden zwischengespeichert und versandt werden, um in eine stark typisierte Weg. Diese Delegierten sind heiß Pfade gleichzeitig zugegriffen.
Die dynamische Bindung Methode würdet Ihr bevorzugen und warum?
InformationsquelleAutor der Frage jsw | 2009-02-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie tatsächlich bestehende Methoden, die Sie haben eine
MethodInfo
für, und Sie haben das Recht Signaturen, dann würde ich sagenDelegate.CreateDelegate
ist der richtige Weg zu gehen - es tut genau das, was Sie wollen, mit kein Aufhebens. Ich würde verwendenDynamicMethod
oder Ausdruck Bäume, wenn ich brauchte, um erstellen Sie einen Delegaten ausführen einer Logik, die nicht bereits gefangen in einer Methode.Ausdruck Bäume sind (IMO, und ich habe nicht verwendet
DynamicMethod
im Zorn) etwas leichter zu bedienen alsDynamicMethod
aber Sie sind mehr eingeschränkt - grundsätzlich können Sie nur einen einzigen Ausdruck (die andere Methode aufgerufen werden, natürlich).DynamicMethod
gibt Ihnen viel Flexibilität, aber Sie müssen verstehen, IL einigermaßen gut.Hilft das?
InformationsquelleAutor der Antwort Jon Skeet
Über Ayende s blog ich habe diesen interessanten link, der zeigt, aus der Art der Dinge, die Sie tun können, mit Dynamischen Methoden. Als ein Beispiel ist es durchaus verständlich:
Beschleunigung der Enum-Basierte Wörterbücher mit Generischen EnumComparer
Update
Sollte man beachten, dass in der Welt der WinRT,
Reflection.Emit
ist nicht verfügbar - einige Informationen können gefunden werden hierInformationsquelleAutor der Antwort flq