2008-12-23 15 views
6

में किसी संपत्ति से किसी संपत्ति का नाम कैसे प्राप्त करूं, मुझे पता है कि मेरे पास एक विशेषता हो सकती है लेकिन यह अधिक काम है जितना मैं जाना चाहता हूं ... और सामान्य नहीं।मैं सी # (2.0)

मैं की तरह

class Whotsit 
{ 
    private string testProp = "thingy"; 

    public string TestProp 
    { 
     get { return testProp; } 
     set { testProp = value; } 
    } 

} 

... 

Whotsit whotsit = new Whotsit(); 
string value = GetName(whotsit.TestProp); //precise syntax up for grabs.. 

कुछ जहाँ मैं मान "TestProp"

बराबर करने के लिए उम्मीद थी क्या करना चाहते हैं, लेकिन मैं मुझे के जीवन के लिए सही प्रतिबिंब तरीकों लिखने के लिए नहीं मिल सकता है GetName विधि ...

संपादित करें: मैं ऐसा क्यों करना चाहता हूं? मेरे पास 'नाम', 'मान' तालिका से पढ़ने वाली सेटिंग्स को स्टोर करने के लिए एक कक्षा है। यह प्रतिबिंब के आधार पर एक सामान्यीकृत विधि द्वारा आबादी है। मैं काफी रिवर्स लिखने के लिए करना चाहते हैं ...

/// <summary> 
/// Populates an object from a datatable where the rows have columns called NameField and ValueField. 
/// If the property with the 'name' exists, and is not read-only, it is populated from the 
/// valueField. Any other columns in the dataTable are ignored. If there is no property called 
/// nameField it is ignored. Any properties of the object not found in the data table retain their 
/// original values. 
/// </summary> 
/// <typeparam name="T">Type of the object to be populated.</typeparam> 
/// <param name="toBePopulated">The object to be populated</param> 
/// <param name="dataTable">'name, 'value' Data table to populate the object from.</param> 
/// <param name="nameField">Field name of the 'name' field'.</param> 
/// <param name="valueField">Field name of the 'value' field.</param> 
/// <param name="options">Setting to control conversions - e.g. nulls as empty strings.</param> 

public static void PopulateFromNameValueDataTable<T> 
     (T toBePopulated, System.Data.DataTable dataTable, string nameField, string valueField, PopulateOptions options) 
    { 
     Type type = typeof(T); 
     bool nullStringsAsEmptyString = options == PopulateOptions.NullStringsAsEmptyString; 

     foreach (DataRow dataRow in dataTable.Rows) 
     { 
      string name = dataRow[nameField].ToString(); 
      System.Reflection.PropertyInfo property = type.GetProperty(name); 
      object value = dataRow[valueField]; 

      if (property != null) 
      { 
       Type propertyType = property.PropertyType; 
       if (nullStringsAsEmptyString && (propertyType == typeof(String))) 
       { 
        value = TypeHelper.EmptyStringIfNull(value); 
       } 
       else 
       { 
        value = TypeHelper.DefaultIfNull(value, propertyType); 
       } 

       property.SetValue(toBePopulated, System.Convert.ChangeType(value, propertyType), null); 
      } 
     } 
    } 

को और संपादित: मैं बस कोड में हूँ, Whotsit का एक उदाहरण है और मैं 'TestProp' संपत्ति का पाठ स्ट्रिंग प्राप्त करना चाहते हैं। ऐसा लगता है कि मैं अजीब तरह से जानता हूं, मैं केवल शाब्दिक "टेस्टप्रॉप" का उपयोग कर सकता हूं - या मेरी कक्षा के मामले में डेटाटेबल फ़ंक्शन के लिए मैं PropertyInfos के फ़ोरैच लूप में रहूंगा। मैं सिर्फ उत्सुक था ...

मूल कोड में स्ट्रिंग स्थिरांक था, जो मुझे बेकार लगता था।

+0

देखें आपने एक उत्तर यहाँ http://stackoverflow.com/a/1225702/661933 मैं क्या चाहते हैं के लिए करने के लिए – nawfal

उत्तर

6

नहीं, ऐसा करने के लिए कुछ भी नहीं है। अभिव्यक्ति whotsit.TestProp संपत्ति का मूल्यांकन करेगी। - कोड से नहीं

// I wish... 
MemberInfo member = infoof(whotsit.TestProp); 

यह है के रूप में, आप केवल प्रतिबिंब नाम से संपत्ति प्राप्त करने के लिए उपयोग कर सकते हैं: क्या आप चाहते हैं पौराणिक "infoof" ऑपरेटर है। (या पाठ्यक्रम के सभी गुण प्राप्त, हालांकि यह अभी भी अपने नमूने के साथ मदद नहीं करता है।।)

एक वैकल्पिक एक अभिव्यक्ति पेड़ का उपयोग करने के लिए है:

Expression<Func<string>> =() => whotsit.TestProp; 

तो पाने के लिए अभिव्यक्ति पेड़ की जांच संपत्ति।

यदि इनमें से कोई भी मदद नहीं करता है, तो शायद आप हमें यह बता सकते हैं कि आप यह कार्यक्षमता क्यों चाहते हैं?

-1

GetProperties on the Type class आपको उस प्रकार की संपत्तियों की सूची देगा।

Type t = whotsit.GetType(); 
PropertyInfo[] pis = t.GetProperties(); 
+0

सच है, लेकिन बहुत ज्यादा नहीं उपयोग हो सकता है ऐसा करें क्योंकि यह उस नाम की स्ट्रिंग है जिसके बाद मैं हूं ... – kpollock

0

जो आप करने की कोशिश कर रहे हैं वह संभव नहीं है। प्रतिबिंब का उपयोग करके आप कर सकते हैं:

  • इसकी स्ट्रिंग नाम से कोई संपत्ति, फ़ील्ड या विधि का विवरण प्राप्त करें।
  • किसी दिए गए प्रकार के लिए सभी गुणों, फ़ील्ड या विधियों की एक सूची प्राप्त करें।

आपकी GetName विधि, जिसे कॉल किया जाता है, एक स्ट्रिंग पास कर दिया जाता है। GetMethod स्ट्रिंग के बारे में जानेंगे लेकिन कोई स्रोत प्रॉपर्टी मेटा डेटा नहीं रखता है।

ब्याज से, आप ऐसा करने का प्रयास क्यों कर रहे हैं?

0

मैं यह संभव है नहीं लगता है, यह करने के लिए एक ही रास्ता गुण से अधिक पुनरावृति करने के लिए है:

class TestClass 
{ 
    private string _field; 

    public string MyProperty 
    { 
     get { return _field; } 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     TestClass test = new TestClass(); 
     PropertyInfo[] info = test.GetType().GetProperties(); 
     foreach(PropertyInfo i in info) 
      Console.WriteLine(i.Name); 
     Console.Read(); 
    } 
} 
+0

जो अभी भी मुझे इसके उदाहरण से किसी संपत्ति का नाम प्राप्त करने की क्षमता नहीं देगा। – kpollock

3

यह (प्रतिबिंब के बिना) के लिए संभव है, लेकिन केवल नवीनतम के साथ सी # 3.0

त्वरित & बहुत बहुत गंदे

class Program 
{ 
    static void Main() 
    { 
     string propertyName = GetName(() => AppDomain.CurrentDomain); 
     Console.WriteLine(propertyName); // prints "CurrentDomain" 
     Console.ReadLine(); 
    } 

    public static string GetName(Expression<Func<object>> property) 
    { 
     return property.Body.ToString().Split('.').Last(); 
    } 
} 

अद्यतन: मुझे अभी एहसास हुआ है कि Jon Skeet (कोई भी हैरान है? :) ने पहले से ही इस संभावना को कवर किया है, लेकिन अगर मैं किसी से शुरू करने के लिए किसी उदाहरण में रूचि रखता हूं तो मैं अपना जवाब यहां रखूंगा।

+0

को भी .NET 3.5 (ओपी स्टेटस 2.0) –

+0

की आवश्यकता है, मुझे पता है लेकिन यह अच्छा सामान्य प्रश्न है और .NET 3.5 वाले किसी को इसमें रुचि हो सकती है। –

+0

मैं सहमत हूं, मेरे लिए ज्यादा उपयोग नहीं, लेकिन शायद आने वाले अन्य लोगों के लिए उपयोग की जा सकती है। – kpollock

0

Kpollack, आप पहले के एक टिप्पणी में कहा:

जो अभी भी मुझे इसे का एक उदाहरण से एक संपत्ति के नाम प्राप्त करने की क्षमता नहीं देंगे।

इससे मुझे विश्वास होता है कि आप किसी संपत्ति के संदर्भ में हैं। आपको यह संदर्भ कैसे मिला? इसका प्रकार क्या है? क्या आप एक कोड नमूना प्रदान कर सकते हैं? यदि यह एक PropertyInfo ऑब्जेक्ट है, तो आपके पास पहले से ही आपकी आवश्यकता है; चूंकि यह मामला प्रतीत नहीं होता है, इसलिए हम कुछ और से निपट रहे हैं, और मुझे यह देखने में बहुत दिलचस्पी होगी कि के साथ काम करना है।

पीएस मुझे लगने लगने के लिए क्षमा करें: यह जल्दी है, मेरे पास पर्याप्त कॉफी नहीं है, और मेरे पास मेरे सामने मेरा आईडीई नहीं है। : -/

+0

मैं सिर्फ कोड में हूं, व्हाट्सिट का एक उदाहरण है और मैं 'टेस्टप्रॉप' संपत्ति की टेक्स्ट स्ट्रिंग प्राप्त करना चाहता हूं। ऐसा लगता है कि मैं अजीब तरह से जानता हूं, मैं केवल शाब्दिक "टेस्टप्रॉप" का उपयोग कर सकता हूं - या मेरी कक्षा के मामले में डेटाटेबल फ़ंक्शन के लिए मैं PropertyInfos के फ़ोरैच लूप में रहूंगा। मैं बिलकुल उत्सुक था। – kpollock

0

एफवाईआई, मैंने यह देखने के लिए क्रमबद्ध करने की कोशिश की कि क्या, मौके से, जिसमें संपत्ति का नाम है, लेकिन कोई भाग्य नहीं है।

बेकार नीचे कोड:

Whotsit w = new Whotsit(); 
XmlSerializer xs = new XmlSerializer(w.TestProp.GetType()); 
TextWriter sw = new StreamWriter(@"c:\TestProp.xml"); 
xs.Serialize(sw, w.TestProp); 
sw.Close();