मैं एक method in C# बनाया methodNameप्रकार 'System.Linq.Expressions.UnaryExpression' की वस्तु कास्ट करने के लिए 'System.Linq.Expressions.MemberExpression' टाइप करने में असमर्थ
public string GetCorrectPropertyName<T>(Expression<Func<T, string>> expression)
{
return ((MemberExpression)expression.Body).Member.Name; // Failure Point
}
हो और
के रूप में यह बुला लिएstring lcl_name = false;
public string Name
{
get { return lcl_name ; }
set
{
lcl_name = value;
OnPropertyChanged(GetCorrectPropertyName<ThisClassName>(x => x.Name));
}
}
यह ठीक काम करता है अगर संपत्ति स्ट्रिंग है और अन्य सभी प्रकार के लिए इस अपवाद देता है:
की वस्तु कास्ट करने में असमर्थ 'System.Linq.Expressions.MemberExpression' टाइप करने के लिए 'System.Linq.Expressions.UnaryExpression' टाइप करें।
- मैं विधि हस्ताक्षर में आपत्ति उठाने का स्ट्रिंग बदल गया है, लेकिन फिर इसे फिर से विफल रहता है।
- मैं
x => Convert.ToString(x.PropertyName)
करने के लिएx => x.PropertyName
से बुला बदल गया है और यह अभी भी
मैं गलत कहाँ हूँ विफल रहता है?
आईएमओ इस बदलाव की बेहतरता का उपयोग करना बेहतर है जहां सहायक 'अभिव्यक्ति> 'लेता है। यह कॉल साइट सिंटैक्स को 'GetCorrectPropertyName (() => this.Name) में बदलता है,' जो मेरे विचार में टाइप करने के लिए बेहतर है (जेनेरिक टाइप पैरामीटर देने की कोई आवश्यकता नहीं है) और पढ़ने के लिए बेहतर ('यह नाम' conveys इरादा बेहद अच्छी तरह से)। –
Jon
@ जोन: बडी आपका जवाब जोड़ने के लिए स्वतंत्र महसूस करते हैं। यदि वर्तमान उत्तर से बेहतर है, तो मैं निश्चित रूप से आपके स्वीकार करूँगा। –
मैं ऐसा नहीं करना चाहता क्योंकि यह आपके प्रश्न का इरादा रखेगा। लेकिन आप आसानी से इसके लिए कोड यहां ले सकते हैं [http://compositewpf.codeplex.com/SourceControl/changeset/view/65392#1024364), माइक्रोसॉफ्ट वास्तव में प्रिज्म में यह करता है। – Jon