2009-05-12 22 views
5

यदि यह प्रश्न अच्छी तरह तैयार नहीं है तो कृपया मेरे साथ भालू। जानना समस्या का हिस्सा नहीं है।सी # में संपत्ति का जिक्र करते हुए। प्रतिबिंब? सामान्य? प्रकार?

जो मैं पूरा करना चाहता हूं उसका एक उदाहरण WPF में PropertyChangedEventArgs में पाया जा सकता है। आप ध्वज को संपत्ति WPF में बदल गया है चाहते हैं, आप इसे इस प्रकार कार्य करें:

PropertyChanged(this, new PropertyChangedEventArgs("propertyName")); 

आप PropertyChangedEventArgs करने के लिए एक स्ट्रिंग कि संपत्ति नाम बदल को संदर्भित करता है गुजरती हैं।

आप कल्पना कर सकते हैं कि मैं वास्तव में अपने कोड पर संपत्ति नामों के लिए हार्ड कोडित स्ट्रिंग नहीं चाहता हूं। रिफैक्टर-नाम इसे याद करता है, ज़ाहिर है, जो न केवल सौंदर्यपूर्ण रूप से अपरिहार्य बनाता है बल्कि त्रुटि प्रवण भी बनाता है।

मैं बहुत अधिक संपत्ति को ... किसी भी तरह से संदर्भित करता हूं।

PropertyChanged(this, new PropertyChangedEventArgs(?SomeClass.PropertyName?)); 

ऐसा लगता है कि मुझे इसे एक छोटी विधि में लपेटने में सक्षम होना चाहिए जो मुझे ऊपर जैसा कुछ कहने देता है।

private void MyPropertyChanged(??) { 
    PropertyChanged(this, new PropertyChangedEventArgs(??.ToString()??)); 
} 

... so I can say something like: 
MyPropertyChanged(Person.Name); //where I'm interested in the property *itself* 

अब तक मैं एक खाली चित्र खींच रहा हूं।

+0

यह भी देखें http://stackoverflow.com/questions/388775/how-do-i-get-the-name-of-a-property-from-a-property-in-c-2-0 –

+0

http : //weblogs.asp.net/cazzu/archive/2006/07/06/Linq-beyond-queries_3A00_-strong_2D00_typed-reflection_2100_।एएसपीएक्स –

+0

संभावित डुप्लिकेट [विधि नाम प्राप्त करें और लैम्ब्डा अभिव्यक्ति का उपयोग करके टाइप करें] (http://stackoverflow.com/questions/273941/get-method-name-and-type-using-lambda-expression) – nawfal

उत्तर

6

दुर्भाग्य से ऐसा करने का कोई सीधा तरीका नहीं है; हालांकि, आप इसे .NET 3.5 में Expression के माध्यम से कर सकते हैं। अधिक के लिए See here। उदाहरण कॉपी करने के लिए:

PropertyInfo prop = PropertyHelper<Foo>.GetProperty(x => x.Bar); 

(यह बहुत है कि बदलने के लिए PropertyInfo के बजाय नाम वापस जाने के लिए आसान है)।

OnPropertyChanged(x=>x.Name); 

का उपयोग कर:

इसी तरह, यह एक प्रकार लिखने के लिए बहुत आसान होगा

OnPropertyChanged<T>(Expression<Func<MyType,T>> property) {...} 
+0

धन्यवाद - महान अंतर्दृष्टि –

1

यह एक अक्सर अनुरोध किया सुविधा, जिन्हें आमतौर पर infoof ("की जानकारी") है, जो किसी सदस्य से जुड़े प्रतिबिंब वस्तु को वापस कर देगा, उदाहरण के लिए

PropertyInfo pi = infoof(Person.Name); 

अफसोस की बात है कि डायनामिक कीवर्ड सी # कंपाइलर टीम के समय को अवशोषित कर रहा है!

+0

संयोग से, पिछले हफ्ते मैंने एक ब्लॉग लेख लिखा था "अभी तक कोई जानकारी क्यों नहीं?" इस महीने के अंत में इसकी अपेक्षा करें। –

+0

कूल, क्या यह कहता है "क्योंकि हम आपको सी # 4 में एक आश्चर्यजनक विशेषता के रूप में कुछ और दे रहे हैं जो एक ही चीज करता है लेकिन आपने कभी कल्पना की तुलना में भी बेहतर !!"? * उंगलियों को पार करता है * –

+0

नहीं। यह कहता है "यह लाभ इसके लाभ के लिए बहुत अधिक काम है"। निराश करने के लिए खेद है। –

1

मुझे पूरा भरोसा है कि स्ट्रिंग निर्दिष्ट करने से बचने का कोई तरीका नहीं है - सी # या .NET में कोई सुविधा नहीं है जो आपको गुणों के संदर्भ पास करने की अनुमति देती है, जहां तक ​​मुझे पता है, और प्रतिबिंब API में string पास कर रहा है अब तक का सबसे आसान तरीका होने जा रहा है।

हालांकि, मानक .NET के बाहर, आपको PostSharp (एनईटी के लिए आस्पेक्ट ओरिएंटेड प्रोग्रामिंग) में आपका समाधान मिल सकता है, जो आपको कोड जोड़ने की अनुमति देता है जो विभिन्न गुणों को बदलते समय ईवेंट को बढ़ाने में स्वचालित बनाता है, जैसा कि आपने अपने प्रश्न में प्रदर्शित किया है।

+0

अभिव्यक्ति API यह अनुमति देता है - उदाहरण के लिए मेरे उत्तर में "यहां देखें" को देखता है। –

+0

@Marc: हाँ, ऐसा लगता है कि आप सही हैं, हालांकि यह एक भयानक दौर-विधि है। इसके अलावा, यह मेरे लिए बदसूरत प्रतीत होता है (कम से कम, वाक्यविन्यास को गठबंधन किया जाता है), लेकिन मैं कौन कहूंगा ... यह पूछताछकर्ता जो पसंद करता है वह हो सकता है। – Noldorin

संबंधित मुद्दे