¿Hay una manera más rápida para echar a Fun<TEntity, TId>
Func<TEntity, object>
¿Forma más rápida de emitir un Func <T, T2> a Func <T, object>?
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?
}
}
¿Hay una manera de convertir a un typedGetPropertyFn
Func<TEntity, object>
sin tener reflejo en el código devuelto lambda como el ejemplo anterior?
EDIT: solución modificada añadido
Ok gracias a 280Z28 para que me lleva por el camino correcto, que he incluido en la solución final a continuación. Dejé el código de reflexión para las plataformas que no son compatibles con Expressions. Para las plataformas que lo hacen muestra un 26x a 27x (13/.5 tics avg) aumento de rendimiento para obtener int
y string
propiedades.
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 });
#if NO_EXPRESSIONS
return x => typedGetPropertyFn.Method.Invoke(x, new object[] { });
#else
var typedMi = typedGetPropertyFn.Method;
var obj = Expression.Parameter(typeof(object), "oFunc");
var expr = Expression.Lambda<Func<TEntity, object>> (
Expression.Convert(
Expression.Call(
Expression.Convert(obj, typedMi.DeclaringType),
typedMi
),
typeof(object)
),
obj
);
return expr.Compile();
#endif
}
¿Qué sucede si mi función inicial devuelve un tipo de valor como Guid? Luego recibo un error de tiempo de ejecución cuando intento enviar contenido a Func. –