यह अपेक्षाकृत एक लैम्ब्डा समारोह है कि यहां तक कि गहरे गुण सहित एक वस्तु से एक संपत्ति के मूल्य वापस आ जाएगी, बनाने के लिए आसान है से लैम्ब्डा कार्रवाई बनाएं ...समारोह अभिव्यक्ति
Func<Category, string> getCategoryName = new Func<Category, string>(c => c.Name);
और इस रूप में कहा जा सकता है इस प्रकार ...
string categoryName = getCategoryName(this.category);
लेकिन, केवल ऊपर जिसके परिणामस्वरूप समारोह (या मूल रूप से समारोह बनाने के लिए इस्तेमाल अभिव्यक्ति), किसी को भी लिए एक आसान तरीका प्रदान कर सकते हैं दी विरोध कार्रवाई बनाने ...
Action<Category, string> setCategoryName = new Action<Category, string>((c, s) => c.Name = s);
... जो एक ही संपत्ति मूल्य सक्षम हो जाएगा निम्नानुसार निर्धारित किए हैं?
setCategoryName(this.category, "");
ध्यान दें कि मैं समारोह या अभिव्यक्ति से प्रोग्राम के कार्रवाई बनाने का एक तरीका रहा हूँ - मुझे आशा है कि मैं पता चला है कि मैं पहले से ही पता है कि यह मैन्युअल रूप से बनाने का तरीका।
मैं नेट 3.5 और 4.0 दोनों में काम करने के लिए खुला हूं।
धन्यवाद।
अद्यतन:
शायद मैं अपने सवाल में स्पष्ट नहीं किया जा रहा हूँ, इसलिए मुझे कोशिश करते हैं और अधिक स्पष्ट रूप से प्रदर्शित मैं क्या करने की कोशिश कर रहा हूँ करते हैं।
मैं निम्न विधि है (कि मैं इस सवाल के प्रयोजनों के लिए बनाया है) ...
void DoLambdaStuff<TObject, TValue>(TObject obj, Expression<Func<TObject, TValue>> expression) {
Func<TObject, TValue> getValue = expression.Compile();
TValue stuff = getValue(obj);
Expression<Action<TObject, TValue>> assignmentExpression = (o, v) => Expression<TObject>.Assign(expression, Expression.Constant(v, typeof(TValue)));
Action<TObject, TValue> setValue = assignmentExpression.Compile();
setValue(obj, stuff);
}
क्या मैं देख रहा हूँ कि कैसे मैं कोड के भीतर "assignmentExpression" बना सकता है इतना है कि मैं इसे setValue में संकलित कर सकते हैं? मुझे लगता है कि यह अभिव्यक्ति से संबंधित है। असाइन करें, लेकिन मैं कोड को पूरा करने के लिए पैरामीटर के सही संयोजन को काम नहीं कर सकता।
अंतिम परिणाम
Category category = *<get object from somewhere>*;
this.DoLambdaStuff(category, c => c.Name);
कॉल करने के लिए सक्षम होने के लिए है और यह बारी में एक गेटर और श्रेणी वस्तु का "नाम" संपत्ति के लिए एक सेटर पैदा करेगा।
उपरोक्त संस्करण संकलित करता है, लेकिन जब मैं setValue() को कॉल करता हूं तो इसके परिणामस्वरूप "अभिव्यक्ति लिखने योग्य" के साथ एक ArgumentException में परिणाम होता है।
फिर से धन्यवाद।
मैं सच में समझ में न आप यह स्वचालित रूप से मैन्युअल रूप से करने का विरोध करने से क्या मतलब है। हालांकि, अगर आप गुण सेट करना चाहते हैं और तय करें कि आप किस संपत्ति को रनटाइम पर सेट करना चाहते हैं, तो आपको प्रतिबिंब का उपयोग करना चाहिए। इसके अलावा, आप रन-टाइम लैम्ब्डा एक्सप्रेशन बनाने के लिए अभिव्यक्ति वृक्ष का उपयोग कर सकते हैं। – Henri