Übertragen eines Delegates in eine ActionT oder Funktion in Runtime

8

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.

    
Amir Popovich 21.09.2015, 14:51
quelle

2 Antworten

3

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 ;

    
StriplingWarrior 21.09.2015, 18:22
quelle
1

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%     
k3b 21.09.2015 15:08
quelle

Tags und Links