2013-08-07 7 views
12

, GetConstantValue और GetRawConstantValuePropertyInfo कक्षा के तरीकों के बीच अंतर क्या है? दुर्भाग्यवश एमएसडीएन दस्तावेज इस विषय पर बहुत स्पष्ट नहीं है।GetValue, GetConstantValue और GetRawConstantValue

उत्तर

13

दोनों GetConstantValue और GetRawConstantValue शाब्दिक साथ उपयोग के लिए लक्षित कर रहे हैं (क्षेत्रों के मामले में लगता है const, लेकिन शब्दार्थ यह सिर्फ क्षेत्रों की तुलना में अधिक के लिए आवेदन कर सकते हैं) - GetValue जो रनटाइम पर कुछ के वास्तविक मूल्य मिलेगा विपरीत, एक स्थिर मूल्य (GetConstantValue या GetRawConstantValue के माध्यम से) रनटाइम निर्भर नहीं है - यह मेटाडेटा से सीधे है।

तो फिर हम GetConstantValue और GetRawConstantValue के बीच अंतर प्राप्त करते हैं। असल में, उत्तरार्द्ध अधिक प्रत्यक्ष और आदिम रूप है। यह मुख्य रूप से enum सदस्यों के लिए दिखाता है; - उदाहरण के लिए अगर मैं एक था:

enum Foo { A = 1, B = 2 } 
... 
const Foo SomeValue = Foo.B; 

तो SomeValue की GetConstantValueFoo.B है; हालांकि, GetRawConstantValueSomeValue2 है। विशेष रूप से, आप GetConstantValue का उपयोग नहीं कर सकते हैं यदि आप प्रतिबिंब-केवल संदर्भ का उपयोग कर रहे हैं, क्योंकि मुक्केबाजीFoo के मान की आवश्यकता होगी, जिसे आप केवल प्रतिबिंब का उपयोग करते समय नहीं कर सकते हैं।

+0

मार्क आपकी व्याख्या में 'Properties' के बारे में फ़ील्ड के लिए 'GetRawConstantValue' शामिल है। गुण सही नहीं हो सकते हैं? यदि गलत है, तो क्या आप 'Properties' –

+0

@ श्रीराम सक्थिवेल के साथ एक उदाहरण दिखा सकते हैं, वहां एक समस्या है, जिसमें AFAIK C# में निरंतर अर्थशास्त्र के साथ गुण व्यक्त करने के लिए एक तंत्र शामिल नहीं है। आईएल में किसी भी व्यक्तिगत भाषा की तुलना में अधिक चीजें शामिल हैं। तो नहीं: मुझे विश्वास नहीं है कि एक उदाहरण देना संभव है, कच्चे आईएल लिखने से कम। –

+0

वैसे मेरा अनुमान सही था, धन्यवाद मार्क –

0

मुझे नहीं पता कि आप क्या करने की कोशिश कर रहे हैं। वैसे भी, अगर आप प्रतिबिंब का उपयोग करके किसी संपत्ति के मूल्य को पुनः प्राप्त करना चाहते हैं तो आपको GetValue का उपयोग करना होगा। अर्थात। कुछ इस तरह:

 private string _foo = "fooValue"; 

    public string Foo 
    { 
     get { return _foo; } 
     set { _foo = value; } 
    } 

    public void Test() 
    { 
     PropertyInfo pi = this.GetType().GetProperty("Foo"); 
     string v = (string)pi.GetValue(this, null); 
    } 

नोट के बाद से संपत्ति स्थिर नहीं है कि यदि आप इस उदाहरण में GetConstantValue या GetRawConstantValue फोन आप एक InvalidOperationException मिलता है।

GetConstantValue और GetRawConstantValue के बीच का अंतर मार्क द्वारा पूरी तरह से समझाया गया है।

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