Gibt es einen schnelleren Weg Fun<TEntity, TId>
zu Func<TEntity, object>
Schnellere Möglichkeit, einen Func <T, T2> an Func <T, object> zu senden?
public static class StaticAccessors<TEntity>
{
public static Func<TEntity, TId> TypedGetPropertyFn<TId>(PropertyInfo pi)
{
var mi = pi.GetGetMethod();
return (Func<TEntity, TId>)Delegate.CreateDelegate(typeof(Func<TEntity, TId>), mi);
}
public static Func<TEntity, object> ValueUnTypedGetPropertyTypeFn(PropertyInfo pi)
{
var mi = typeof(StaticAccessors<TEntity>).GetMethod("TypedGetPropertyFn");
var genericMi = mi.MakeGenericMethod(pi.PropertyType);
var typedGetPropertyFn = (Delegate)genericMi.Invoke(null, new[] { pi });
//slow: lambda includes a reflection call
return x => typedGetPropertyFn.Method.Invoke(x, new object[] { }); //can we replace this?
}
}
Gibt es eine Möglichkeit zu werfen typedGetPropertyFn
zu einem Func<TEntity, object>
zu konvertieren, ohne oben wie das Beispiel in der zurück Lambda Reflexionscode?
EDIT: hinzugefügt modifizierte Lösung
Ok dank 280Z28 für mich führt den richtigen Weg, die ich weiter unten in der endgültigen Lösung aufgenommen haben. Ich habe den Reflection-Code für Plattformen, die Expressions nicht unterstützen, dort gelassen. Für Plattformen, die dies tun, zeigt es eine 26x bis 27x (13/.5 Ticks avg) Perf Erhöhung für bekommen int
und string
Eigenschaften.
Was passiert, wenn meine ursprüngliche Funktion einen Werttyp wie Guid zurückgibt? Dann bekomme ich einen Laufzeitfehler beim Versuch, auf Func zu werfen. –