.net - How can I make this work with deep properties -


निम्न कोड को देखते हुए ...

  वर्ग प्रोग्राम {static void main (string [ ] आर्ग्स) {फु फू = नया फ़ू {बार = नया बार {विवरण = "मार्टिन"}, नाम = "मार्टिन"}; DoLambdaStuff (foo, f = & gt; f.Name); DoLambdaStuff (foo, f = & gt; f.Bar.Description); } स्थैतिक शून्य DoLambdaStuff और लेफ्टिनेंट; TObject, TValue & gt; (ऑब्जेक्ट obj, अभिव्यक्ति & lt; Func & lt; Tobject, TValue & gt; अभिव्यक्ति) {// सेट अप और परीक्षण "getter" ... Func & lt; Tobject, TValue & gt; GetValue = अभिव्यक्ति। कॉम्पाइल (); टीवी सामान = मिलन (ओबीजे); // सेट अप करें और "सेटर" का परीक्षण करें ... पैरामीटर एक्स्पेरशन ऑब्जेक्ट पैरामीटर एक्सेशन = एक्सप्रेशन.पैमिटर (टाइपफ (टोबिजेस)), वैल्यूपैमेटरएक्सप्रेस = एक्सप्रेशन.पैमिटर (टाइपफ (टीवील्यू)); अभिव्यक्ति और लेफ्टिनेंट; एक्शन एंड लेफ्टिनेंट; टोबैजेक्ट, टीवील्यू & gt; & gt; SetValueExpression = Expression.Lambda & lt; एक्शन & lt; TObject, TValue & gt; (अभिव्यक्ति। ब्लॉक (अभिव्यक्ति। अभिव्यक्ति। अभिव्यक्ति (अभिव्यक्ति। प्रॉपर्टी (ऑब्जेक्ट पैरामीटर एक्सपेरेशन, (सदस्य अभिप्राय) अभिव्यक्ति।) .मेल। नाम), valueParameterExpression)), ObjectParameterExpression, valueParameterExpression ); एक्शन & लेफ्टिनेंट; टोबिजेक्ट, टीवील्यू & gt; SetValue = setValueExpression.Compile (); सेट वैल्यू (ओबीजे, सामान); }} वर्ग Foo {सार्वजनिक बार बार {get; सेट; } सार्वजनिक स्ट्रिंग नाम {get; सेट; }} वर्ग बार {सार्वजनिक स्ट्रिंग विवरण {get; सेट; }}  

DoLambdaStuff (foo, f = & gt; f.Name) के लिए कॉल काम ठीक है क्योंकि मैं एक उथले संपत्ति तक पहुंच रहा हूं, हालांकि कॉल < कोड> डेलंबडास्टफ (एफू, एफ = & gt; एफ.बार। डिस्क्रिप्शन) विफल रहता है - हालांकि getValue फ़ंक्शन का निर्माण ठीक है, setValueExpression असफल हो जाता है क्योंकि मैं ऑब्जेक्ट की गहरी संपत्ति तक पहुंचने का प्रयास कर रहा हूं।

क्या कोई मुझे इस को संशोधित करने में मदद कर सकता है ताकि मैं गहरे गुणों के लिए setValueExpression बना सकूं उथले?

धन्यवाद।

आपको इस तथ्य का लाभ उठाना होगा कि आपका अभिव्यक्ति। पहले से ही वह संपत्ति का प्रतिनिधित्व कर रहा है जिसे आप सेट करना चाहते हैं। इसका अर्थ है कि आप अभिव्यक्ति का उपयोग कर सकते हैं। अपने असाइनमेंट अभिव्यक्ति में बाईं ओर के रूप में बॉडी:

  सार्वजनिक स्थिर शून्य Main (string [] args) {Foo foo = new Foo {bar = new बार {नाम = "मार्टिन", बज़ = नया फिज़ () {नाम = "कार्ल"}}, नाम = "मार्टिन"}; DoLambdaStuff (foo, f = & gt; f.Bar.Name, "डेनिस"); DoLambdaStuff (foo, f = & gt; f.Bar.Buzz.Name, "डेनिस"); Console.WriteLine (foo.Bar.Name); Console.WriteLine (foo.Bar.Buzz.Name); } स्थैतिक शून्य DoLambdaStuff और लेफ्टिनेंट; TObject, TValue & gt; (TObject obj, अभिव्यक्ति & lt; Func & amp; टीटी; टूबाइजेक्ट, टीवील्यू & gt; अभिव्यक्ति, टीवी मूल्य valueToSet) {// गेटर फ़ंक्शन & lt; TObject, TValue & gt; प्राप्तकर्ता = अभिव्यक्ति। कॉम्पाइल (); टीवी सामान = गेटेर (ओबीजे); पैरामीटर एक्सपेरेशन pObj = अभिव्यक्ति। पैरामीटर [0]; पैरामीटर एक्सपेरेशन pValue = Expression.Parameter (टाइपफ (टीवील्यू), "वेल्यू"); Var सेटटरब्लॉक = अभिव्यक्ति.ब्लॉक (अभिव्यक्ति। एस्सिन (अभिव्यक्ति। बॉडी, पीवल्यू)); Var सेटटर एक्सप्रेशन = एक्सप्रेशन। लैम्ब्डा & लेफ्टिनेंट; एक्शन एंड लेफ्टिनेंट; टोबैजेक्ट, टीवील्यू & gt; & gt; (सैटरब्लॉक, पॉब, पीवीएल्यूई); एक्शन & लेफ्टिनेंट; टोबिजेक्ट, टीवील्यू & gt; सेटर = सेटटर एक्सेशन। कॉम्पली (); // टेस्ट सेटर (obj, valueToSet); }  

Comments