2009-11-03 28 views
7

संभव डुप्लिकेट:
c# - How do you get a variable’s name as it was physically typed in its declaration?आपको सी # संपत्ति का नाम प्रतिबिंब के साथ स्ट्रिंग के रूप में कैसे मिलता है?

मैं एक तरह से एक स्ट्रिंग के रूप में एक संपत्ति नाम पाने के लिए तो मैं एक "दृढ़ता से टाइप" जादू स्ट्रिंग हो सकता है के लिए देख रहा हूँ। मुझे ऐसा करने की ज़रूरत है जैसे MyClass.SomeProperty.GetName() जो "कुछ प्रॉपर्टी" लौटाएगा। क्या यह सी # में संभव है?

उत्तर

6

आप इसे आसानी से प्राप्त करने के लिए अभिव्यक्तियों का उपयोग कर सकते हैं। यह blog for a sample देखें।

इससे ऐसा होता है ताकि आप लैम्ब्डा के माध्यम से एक अभिव्यक्ति बना सकें और नाम निकाल सकें।

string propertyName = Reflect.GetProperty(() => SomeProperty).Name; 

वियोला:, आप की तरह कुछ करना चाहते हैं

public int MyProperty { 
    get { return myProperty; } 
    set 
    { 
     myProperty = value; 
     RaisePropertyChanged(() => MyProperty); 
    } 
} 

आदेश में अपने बराबर मैप करने के लिए, संदर्भित "प्रतिबिंबित" वर्ग का उपयोग कर: उदाहरण के लिए, को लागू करने INotifyPropertyChanged की तरह कुछ करने के लिए फिर से काम किया जा सकता है - जादू तारों के बिना संपत्ति के नाम।

+0

यहां वाक्यविन्यास थोड़ा बुरा है, लेकिन ऐसा करता है जो मुझे इसकी आवश्यकता होती है। धन्यवाद! –

1

आप प्रतिबिंब का उपयोग कर किसी ऑब्जेक्ट की गुणों की एक सूची प्राप्त कर सकते हैं।

MyClass o; 

PropertyInfo[] properties = o.GetType().GetProperties(
    BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance 
); 

प्रत्येक संपत्ति एक नाम विशेषता है जो आप "SomeProperty" मिलेगा है

8

यह दृष्टिकोण रास्ता Expression

public static string GetName<T>(this T item) where T : class 
{ 
    if (item == null) 
     return string.Empty; 

    return typeof(T).GetProperties()[0].Name; 
} 

अभी सेवा का उपयोग की तुलना में तेजी हो जाएगा आप इसे कॉल कर सकते हैं:

new { MyClass.SomeProperty }.GetName(); 

यदि आपको और भी अधिक प्रदर्शन की आवश्यकता है तो आप मूल्यों को कैश कर सकते हैं। यह डुप्लिकेट प्रश्न देखें How do you get a variable's name as it was physically typed in its declaration?

+0

यहां सबसे अच्छा जवाब। मैं गुणों को लूप नहीं करना चाहता, मैं एक वास्तविक संपत्ति के आधार पर एक संपत्ति का नाम प्राप्त करना चाहता हूं। अनाम (केवल) संपत्ति के साथ अज्ञात प्रकार का उपयोग करना, जिसे आप चाहते हैं वह नाम प्रतिभा है। – Paul

+0

@ पॉल मैं इसके पीछे प्रतिभा नहीं हूं। दूसरा, यह बहुत ही रिफैक्टर अनुकूल नहीं है। मेरा मतलब है कि यदि आप संपत्ति का नाम बदलते हैं, तो अनाम प्रकार मूल नाम को सुरक्षित रखता है। इस मामले में, यदि आप 'कुछ प्रॉपर्टी' को 'कुछप्रॉपर्टी 1' में बदलते हैं, तो अज्ञात वर्ग 'नया {कुछ प्रॉपर्टी = कुछप्रॉपर्टी 1}' में बदल जाता है, जो "SomeProperty1" अपडेट किए गए नाम के बजाय "SomeProperty" प्रिंट करेगा। मैं जवाब में इसका उल्लेख करूंगा। – nawfal

+0

डारन। मुझे कभी भी एक संपत्ति का नाम बदलने की उम्मीद नहीं है, लेकिन अगर मैंने कभी किया है, तो मैं इसे संभालने के लिए रिफैक्टरिंग करना चाहता हूं। मुझे बताने के लिए धन्यवाद। – Paul

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