वहाँ एक तेज़ तरीका Func<TEntity, object>
फन <T, T2> फन <T, object> पर फनक <T, T2> डालने का तेज़ तरीका?
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?
}
}
वहाँ एक रास्ता ऊपर के उदाहरण की तरह लौटे लैम्ब्डा में प्रतिबिंब कोड के बिना एक Func<TEntity, object>
को typedGetPropertyFn
कन्वर्ट करने के लिए है करने के लिए Fun<TEntity, TId>
कास्ट करने के लिए है?
संपादित करें: जोड़ा संशोधित समाधान मुझे नीचे अग्रणी सही रास्ते जो मैं नीचे अंतिम समाधान में शामिल किया है के लिए 280Z28 को
ठीक है धन्यवाद। मैंने ऐसे प्लेटफ़ॉर्म के लिए प्रतिबिंब कोड छोड़ा है जो अभिव्यक्तियों का समर्थन नहीं करते हैं। प्लेटफ़ॉर्म के लिए जो 26x से 27x (13/.5 टिक औसत) पर int
और string
गुण प्राप्त करने के लिए बढ़ रहा है।
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
}
क्या होगा यदि मेरा प्रारंभिक फ़ंक्शन गुड जैसे मूल्य प्रकार लौटाता है? तो मुझे Func पर डालने का प्रयास करते समय रनटाइम त्रुटि मिल रही है। –