Ich versuche, meinen Reflektionscode zu verbessern, indem ich Delegates für die Methoden Getter
und Setter
erstelle.
Mein Code sieht so aus:
%Vor% CreateDelegate
gibt Delegate
zurück, und DynamicInvoke
ist nicht leistungsfähig.
Ich habe die Delegate
in Action<T> \ Func<T>
gecastet (hartcodiert) und einen enormen Anstieg meiner Leistung gesehen.
Ich habe dann versucht, das Delegate
in Action<T> \ Func<T>
in Laufzeit zu rotieren (mit Convert.ChangeType
und dynamic
) und meine Leistung wurde verletzt - wahrscheinlich aufgrund der Tatsache, dass ich einen dynamic
Typ verwende.
Ich bin mir ziemlich sicher, dass ich das ohne dynamic
machen kann.
Ich rate Die Lösung hat etwas mit expression trees
zu tun, aber ich bin mir nicht sicher, wie ich so etwas programmieren soll. Wenn jemand eine gute Lösung hat, die expression trees
nicht verwendet, wird es auch interessant sein, davon zu hören.
Wenn es Ihr Ziel ist, Ihre Aktion / Funktion aufrufen zu können, ohne den Rückgabetyp zur Kompilierungszeit zu kennen, dann möchten Sie wahrscheinlich mit Action<object>
und Func<object>
enden, richtig?
Sie können dies tun, ohne einen Ausdrucksbaum oder etwas Ähnliches kompilieren zu müssen:
%Vor%Verwenden Sie diese Hilfsmethode:
%Vor% Meine Tests zeigen, dass dies ungefähr 25% schneller ist als die Verwendung von dynamic
und etwa 45% langsamer als nur obj.Prop = 2
;
Gibt es einen Grund, warum Sie Action & lt; T & gt; oder Func & lt; T & gt; ein Property dynamisch erhalten / setzen?
Wenn nicht, können Sie PropertyInfo verwenden. GetMethod () und SetMethod ()
%Vor%Tags und Links c# reflection casting