2015-10-28 8 views
6

मैं प्रतिबिंब के साथ प्रयोग करने की कोशिश कर रहा हूं और मेरे पास एक प्रश्न है।सी # 6.0 और प्रतिबिंब, संपत्ति प्रारंभकर्ताओं का मूल्य प्राप्त करना

चलें कहना वर्ग initilizating बिना मैं एक वर्ग है, और इस वर्ग में मैं एक संपत्ति की ग # 6,0

Class MyClass() 
{ 
    public string SomeProperty{ get; set; } = "SomeValue"; 
} 

वहाँ प्रतिबिंब के साथ इस मूल्य मिल रहा है, का कोई तरीका है नई सुविधा के साथ initilized है, ?

मुझे पता है कि मैं यह कर सकता हूं;

var foo= new MyClass(); 
var value = foo.GetType().GetProperty("SomeProperty").GetValue(foo); 

लेकिन मैं जो करना चाहता हूं वह इस तरह से कुछ है;

typeof(MyClass).GetProperty("SomeProperty").GetValue(); 

मुझे पता है कि मैं मूल्य प्राप्त करने के लिए एक क्षेत्र का उपयोग कर सकता हूं। लेकिन इसे एक संपत्ति होने की जरूरत है।

धन्यवाद।

+0

AFAIK आप तब तक मूल्य नहीं प्राप्त कर सकते जब तक कक्षा को तत्काल नहीं किया जाता है और आवंटित स्मृति और उसके फ़ील्ड प्रारंभ किए जाते हैं। एक क्रॉस चेक के रूप में अब तक के अधिकांश ज्ञात प्रतिबिंब तरीकों में पैरामीटर के रूप में एक उदाहरण/वस्तु है। –

+0

मुझे लगता है कि ऐसा नहीं किया जा सकता है, क्योंकि संपत्ति और वर्ग स्थिर नहीं हैं। संपत्ति तक पहुंचने के लिए आपको एक वैध ऑब्जेक्ट उपलब्ध होना चाहिए (स्मृति में संदर्भ होना)। –

+0

उत्तर राज्यों के रूप में, जब तक क्लास ऑब्जेक्ट प्रारंभ नहीं किया जाता है, तब तक स्मृति में कोई स्ट्रिंग ऑब्जेक्ट नहीं होता है जो इसे निर्दिष्ट मान संग्रहीत करता है। स्ट्रिंग ऑब्जेक्ट और उसके लिए आवंटित मान प्राप्त करने के लिए आपको एक उदाहरण बनाना होगा। – danish

उत्तर

5

यह सिर्फ एक वाक्यविन्यास चीनी है। यह:

class MyClass() 
{ 
    public string SomeProperty{ get; set; } = "SomeValue"; 
} 

इस में संकलक द्वारा unwrapped किया जाएगा:

class MyClass() 
{ 
    public MyClass() 
    { 
     _someProperty = "SomeValue"; 
    } 

    // actually, backing field name will be different, 
    // but it doesn't matter for this question 
    private string _someProperty; 

    public string SomeProperty 
    { 
     get { return _someProperty; } 
     set { _someProperty = value; } 
    } 
} 

प्रतिबिंब मेटाडाटा के बारे में है। मेटाटाडा में संग्रहीत कोई भी "SomeValue" नहीं है। आप जो भी कर सकते हैं, नियमित रूप से संपत्ति मूल्य को पढ़ना है।

मुझे लगता है मैं एक क्षेत्र का उपयोग मूल्य

प्राप्त करने के लिए कर सकता है एक वस्तु instantiating बिना पता है, तुम केवल स्थिर क्षेत्रों के मूल्यों को प्राप्त कर सकते हैं।
उदाहरण फ़ील्ड के मान प्राप्त करने के लिए, आपको जाहिर है, ऑब्जेक्ट का उदाहरण चाहिए।

+0

ओह, मैं देखता हूं। धन्यवाद। – Rudithus

1

वैकल्पिक रूप से, यदि आपको प्रतिबिंब मेटाडेटा में संपत्ति के डिफ़ॉल्ट मान की आवश्यकता है, तो आप विशेषताएँ का उपयोग कर सकते हैं, सिस्टम में से एक। कॉम्पोनेंट मॉडेल, काम करें: DefaultValue। उदाहरण के लिए:

using System.ComponentModel; 

class MyClass() 
{ 
    [DefaultValue("SomeValue")] 
    public string SomeProperty{ get; set; } = "SomeValue"; 
} 
// 
var propertyInfo = typeof(MyClass).GetProperty("SomeProperty"); 
var defaultValue = (DefaultValue)Attribute.GetCustomeAttribute(propertyInfo, typeof(DefaultValue)); 
var value = defaultValue.Value; 
संबंधित मुद्दे