2010-07-27 10 views
9

मैं उदाहरण के लिए, एक संपत्ति के नाम पर प्राप्त करना चाहते हैं प्राप्त करें:नेट संपत्ति नाम

Dim _foo As String 

Public Property Foo as String 
Get 
    Return _foo 
End Get 
Private Set(ByVal value as String) 
    _foo = value 
End Set 

Sub Main() 
    Console.Write(Foo.Name)'Outputs "Foo" 
End Sub 

कोई भी विचार कैसे? प्रतिबिंब के माध्यम से

+0

आप स्ट्रिंग चाहते ' "नाम" '? – leppie

उत्तर

24

है। यदि आप एक संपत्ति मतलब है, या आप एक क्षेत्र मतलब है

वहाँ गुण के नाम प्राप्त करने के लिए चतुर लैम्ब्डा तकनीक है - यहाँ एक सी # उदाहरण है:?

String GetPropertyName<TValue>(Expression<Func<TValue>> propertyId) 
{ 
    return ((MemberExpression)propertyId.Body).Member.Name; 
} 

इसे इस तरह कॉल करें:

GetPropertyName(() => MyProperty) 

और यह "माइप्रोपर्टी"

वापस नहीं आएगा, यह सुनिश्चित नहीं है कि आप क्या कर रहे हैं या नहीं।

+0

वास्तव में शानदार! धन्यवाद। – Ucodia

+0

मेरी गलती जब मैंने उदाहरण लिखा था तो मेरा दिमाग कहीं और था। इसे अब बदल दिया – Drahcir

+1

कॉल उदाहरण होना चाहिए: MyClass obj = new MyClass(); GetPropertyName (() => obj.MyProperty) –

0

। प्रकार के GetType() विधि का उपयोग करें, फिर GetProperties() विधि और PropertyInfo क्लास में देखें। (यदि आप एक क्षेत्र प्रॉपर्टी बुलाया के लिए स्ट्रिंग "प्रॉपर्टी" (पुनः प्राप्त करना चाहते हैं -। Xxx.GetType() का उपयोग GetFields() [0] .Name अगर यह पहले क्षेत्र कक्षा में है

+0

यह केवल तभी काम करता है जब आप कक्षा में संपत्ति की अनुक्रमणिका जानते हैं, जो वास्तव में वास्तविक नहीं है क्योंकि वर्ग बदल सकता है या आंशिक हो सकता है। – Ucodia

3
public static PropertyInfo GetPropInfo<T>(this T @object 
    , Expression<Action<T>> propSelector) 
{ 
    MemberExpression exp= propSelector.Body as MemberExpression; 
    return exp.Member as PropertyInfo; 
} 

तो इस तरह इसका इस्तेमाल:

string str = .... 
string propertyName = str.GetPropInfo(a => a.Length).Name; 

ध्यान दें कि उपरोक्त विधि एक विस्तार है और एक स्थिर कक्षा में लिखा जाना चाहिए और प्रयोग किया जाता नाम स्थान

+0

या ओपी के मामले में, वीबी में यह एक विस्तार विधि है जो मॉड्यूल (स्थैतिक वर्ग नहीं) में होनी चाहिए और इस कीवर्ड के बजाय एक्सटेंशन विशेषता के साथ सजाया जाना चाहिए। –

7

शामिल करके आप उपयोग कर रहे हैं सी # 6.0 (इस प्रश्न से पूछे जाने पर जारी नहीं किया गया) आप nameof(PropertyName) का उपयोग कर सकते हैं इसका संकलन समय पर मूल्यांकन किया जाता है और इसे स्ट्रिंग में परिवर्तित किया जाता है, nameof() का उपयोग करने के बारे में अच्छी बात यह है कि जब आप रिफैक्टर करते हैं तो आपको मैन्युअल रूप से स्ट्रिंग को बदलने की आवश्यकता नहीं होती है। (गुण की तुलना में अधिक पर nameof काम करता है, CallerMemberName अधिक प्रतिबंधात्मक है)

तो भी आप पहले सी # 6.0 तो आप उपयोग कर सकते हैं में फंस रहे हैं, तो CallerMemberNameAttribute (ऐसा करना आवश्यक हो .net 4,5)

private static string Get([System.Runtime.CompilerServices.CallerMemberName] string name = "") 
{ 
    if (string.IsNullOrEmpty(name)) 
     throw new ArgumentNullException("name"); 
    return name; 
} 
+0

मुझे नहीं पता कि इसकी अच्छी तरह से सराहना नहीं की गई थी, लेकिन यह विधि वास्तव में साफ है। धन्यवाद – CodeWrite

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