Reflexion-Performance - Erstellen Von Delegaten (Eigenschaften Von C#)

Ich habe performance-Probleme mit mit der spiegelung.

Also habe ich beschlossen zu erstellen Delegierten für die Eigenschaften meiner Objekte und so weit gekommen sind diese:

TestClass cwp = new TestClass();
var propertyInt = typeof(TestClass).GetProperties().Single(obj => obj.Name == "AnyValue");
var access = BuildGetAccessor(propertyInt.GetGetMethod());
var result = access(cwp);
static Func<object, object> BuildGetAccessor(MethodInfo method)
{
    var obj = Expression.Parameter(typeof(object), "o");

    Expression<Func<object, object>> expr =
        Expression.Lambda<Func<object, object>>(
            Expression.Convert(
                Expression.Call(
                    Expression.Convert(obj, method.DeclaringType),
                    method),
                typeof(object)),
            obj);

    return expr.Compile();
}

Die Ergebnisse waren sehr zufriedenstellend, etwa 30-40 mal schneller als die Verwendung der konventionellen Methode (PropertyInfo.GetValue (obj, null);)

Das problem ist: Wie kann ich eine SetValue einer Immobilie, die die gleiche Weise funktioniert? Leider bekommt Sie nicht Weg.

Ich bin dabei, weil ich nicht verwenden können, Methoden, mit <T> aufgrund der Struktur der Anwendung.

  • "Ich mache das so, weil ich kann nicht mit Methoden, die mit "< T >" aufgrund der Struktur der Anwendung" -- bedeutet das, dass Ihre NETFX-version < 2.0? Warum können Sie nicht verwenden, dass Generika in Ihrer Anwendung?
  • Auch nicht, was das erstellen Delegierten für Ihre Immobilien zu tun haben, mit der Reflexion, und welches problem Sie versuchen zu lösen, mit der spiegelung?
  • Die Delegierten haben die deutlich bessere Leistung und kann verwendet werden, dynamisch. Sie sind die bevorzugte option, wenn Sie brauchen, um verwenden der dynamischen Aufruf.
  • klar nicht < 2.0 da er mit generics und Lambda-Ausdrücke selbst. Aber ich bin mit Ihnen. Was versuchst du hier zu tun ist, letztlich?
  • Ja, ich kann (.NET 4.0), aber nicht gut wäre für alle, die der Logik meiner Anwendung. Und es würde viele änderungen zu machen. Vor allem die Kommunikation zwischen den WebServices, es gibt keine Stelle in meiner Anwendung, die gilt, "<T>" Methoden laden, speichern, aktualisieren, einfügen ...
  • Ich würde vorschlagen, zu verwenden Fasterflect, eine umfassende Bibliothek, die macht der Reflexion viel schneller und einfacher zu verwenden an der Spitze. Sehen fasterflect.codeplex.com für details und Gebrauchsspuren. Gebaut mit DynamicMethod und IL-generation mit integrierten caching.
  • Oder ähnlich: FastMember - immer wieder, DynamicMethod / IL, mit built-in-cache
  • Vielen Dank für die Anregungen, ich suchte ein wenig über Bibliotheken. Aber die meisten erfordern viel code zur Implementierung und viele änderungen in meiner Anwendung. Wenn ich noch nicht bekommen, ausreichend Leistung. Ich werde hinter...

InformationsquelleAutor J. Lennon | 2012-05-30
Schreibe einen Kommentar