यह असाइनमेंट ऑपरेटर की वजह से अगर मैं एक लैम्ब्डा अभिव्यक्ति (नीचे) के माध्यम से प्रदान करने में सक्षम थे बहुत सरल हो जाएगाअभिव्यक्ति के माध्यम से मूल्य कैसे असाइन करें?
//An expression tree cannot contain an assignment operator
Expression<Func<ComplexObj, object>> expression = obj => obj.Contacts[0].FirstName = "Tim";
इस कोड को ऊपर अमान्य है। जटिल वस्तु में संपत्ति की पहचान करने के लिए मुझे एक लैम्ब्डा अभिव्यक्ति पारित करने की आवश्यकता है जिसे सेट करने की आवश्यकता है। कुछ मामलों में जटिल ऑब्जेक्ट की सूची होती है और डुप्लिकेट ऑब्जेक्ट प्रकारों और नामों के लिए, इसलिए मुझे ऑब्जेक्ट में फ़ील्ड को स्पष्ट रूप से संदर्भित करने के लिए लैम्ब्डा की आवश्यकता होती है।
मैं निम्न का उपयोग कर मूल्य पुनर्प्राप्त करने में सक्षम हूं, कोई समस्या नहीं। लेकिन मुझे यकीन नहीं है कि मूल्य निर्धारित करने के लिए इस तर्क का उपयोग कैसे करें, मैं अभिव्यक्ति में आया था। साइन इन करें और विश्वास करें कि यह समाधान हो सकता है।
Expression<Func<ComplexObj, object>> expression = obj => obj.Contacts[0].FirstName;
var result = FindByProperty(expression);
public static string FindByProperty(Expression<Func<Contract, object>> propertyRefExpr)
{
ComplexObj obj = new ComplexObj();
Contact myContact = new Contact();
myContact.FirstName = "Allen";
obj.Contacts = new List<Contact>{myContact};
return propertyRefExpr.Compile().Invoke(obj);
}
अद्यतन:
ParentTypeA साथ setValue पद्धति का उपयोग करना "एक अभिव्यक्ति पेड़ ... के रूप में एक विधि के लिए एक संपत्ति काम गुजर", मूल्य काम नहीं करेगा। (नीचे दिए गए कोड)
Expression<Func<ComplexObj, object>> expression = obj => obj.Contacts[0].FirstName;
obj.AssignNewValue(expression, firstName);
public static void AssignNewValue(this ComplexObj obj, Expression<Func<ComplexObj, object>> expression, object value)
{
var propertyInfo = (PropertyInfo)((MemberExpression)expression.Body).Member;
propertyInfo.SetValue(obj, value, null);
}
http://stackoverflow.com/questions/5780232/assign-property-with-an-expressiontree –
इस स्टेन का वादा लग रही है, धन्यवाद – AnxiousdeV