lambdas कई परिदृश्यों के लिए महान हैं - लेकिन अगर आप उन्हें नहीं करना चाहते, शायद बस उन्हें का उपयोग नहीं करते? मुझे यह कहने से नफरत है, लेकिन सरल तारों की कोशिश की जाती है और परीक्षण किया जाता है, खासकर डेटा बाध्यकारी जैसे परिदृश्यों के लिए। यदि आप तेजी से पहुंच चाहते हैं, तो आप हाइपरडिस्क्रिप्टर को देख सकते हैं, या संपत्ति एक्सेसर्स को एक प्रतिनिधि को संकलित करने के तरीके हैं, या आप स्ट्रिंग से Expression
बना सकते हैं और इसे संकलित कर सकते हैं (यदि आप एक ज्ञात हस्ताक्षर चाहते हैं तो एक कास्ट सहित object
) (बहुत धीमी) DynamicInvoke
पर कॉल करने के बजाए)।
बेशक, ज्यादातर मामलों में भी कच्चे प्रतिबिंब पर्याप्त तेज़ होते हैं, और बाधा नहीं होती है।
मैं सबसे सरल कोड से शुरू करने का सुझाव देता हूं, और यह वास्तव में तेज होने के बारे में चिंता करने से पहले धीमा है। यदि यह बहुत धीमी नहीं है, तो इसे न बदलें। उपर्युक्त विकल्पों में से कोई भी अन्यथा काम करेगा।
एक और विचार; यदि आप Expression
उपयोग कर रहे हैं, तो आप की तरह कुछ कर सकता है:
public void IncludeProperties<T>(
Expression<Func<T,object>> selectedProperties)
{
// some logic to store parameter
}
IncludeProperties<IUser>(u => new { u.ID, u.LogOnName, u.HashedPassword });
और फिर अभिव्यक्ति अलग ले?
public static void IncludeProperties<T>(
Expression<Func<T, object>> selectedProperties)
{
NewExpression ne = selectedProperties.Body as NewExpression;
if (ne == null) throw new InvalidOperationException(
"Object constructor expected");
foreach (Expression arg in ne.Arguments)
{
MemberExpression me = arg as MemberExpression;
if (me == null || me.Expression != selectedProperties.Parameters[0])
throw new InvalidOperationException(
"Object constructor argument should be a direct member");
Console.WriteLine("Accessing: " + me.Member.Name);
}
}
static void Main()
{
IncludeProperties<IUser>(u => new { u.ID, u.LogOnName, u.HashedPassword });
}
एक बार जब आप MemberInfo
रों (ऊपर में me.Member
) पता है, व्यक्तिगत पहुँच के लिए अपने स्वयं के lambdas निर्माण तुच्छ होना चाहिए: थोड़ा tidier, कम से कम ... यहाँ कुछ नमूना विखंडन दिखा कोड है। उदाहरण के लिए (object
करने के लिए एक डाली सहित एक भी हस्ताक्षर प्राप्त करने के लिए):
var param = Expression.Parameter(typeof(T), "x");
var memberAccess = Expression.MakeMemberAccess(param, me.Member);
var body = Expression.Convert(memberAccess, typeof(object));
var lambda = Expression.Lambda<Func<T, object>>(body, param);
var func = lambda.Compile();
ओह, अच्छा एक :) –
क्या करने के लिए सबसे अच्छा तरीका है त्वरित पहुंच के लिए चयनित गुण रखें? सूची? –
'सदस्यइन्फो 'ठीक होगा; 'Func' (या 'Func