2013-08-09 5 views
6

मैं बहुत यकीन है कि यह इंटरफेस और विरासत को लागू करने से संबंधित है कर रहा हूँ है।कैसे ग # System.Type प्रकार एक नाम संपत्ति

सी # में कैसे System.Type वर्ग संपत्ति का नाम है? जब मैं उदाहरण के मेटाडाटा या ऑब्जेक्ट ब्राउज़र मैं देख रहा हूँ का उपयोग करने से टाइप वर्ग के कोड प्रकार वर्ग नहीं है:

string Name 

कहीं भी परिभाषित किया।

मैं यह भी देखना है कि प्रकार MemberInfo से विरासत और लागू करता _Type और IReflect (इस तरह):

public abstract class Type : MemberInfo, _Type, IReflect 

आधार वर्ग MemberInfo संपत्ति है:

public abstract string Name { get; } 

जो मैं जानता हूँ, इस से में को सार तत्वक के कारण व्युत्पन्न कक्षा में ओवरराइड किया गया है।

string Name { get; } 

और यह अपने आप में कोई कार्यान्वयन या तो नहीं है, क्योंकि है कि एक अंतरफलक में है: मैं तो _Type इंटरफ़ेस में एक संपत्ति है प्रकार में यह दिखाई नहीं देता ...

है कहाँ नाम परिभाषित हो रही है और यह कैसे System.Type कक्षा में एक मूल्य है? या मैं समझ नहीं कैसे विरासत और लागू करने इंटरफेस इस वर्ग

उत्तर

10

सूचना है कि System.Type ही एक अमूर्त वर्ग है के लिए काम करता हूँ। इसका मतलब है कि इसे उप-वर्ग में ओवरराइड किया जा सकता है। वास्तव में, आपको लगता है कि रन-टाइम में प्रकार यदि आप कुछ इस तरह करते हैं वास्तव में नहीं System.Type के हैं देख सकते हैं:

typeof(Type).GetType().FullName; // System.RuntimeType 

System.RuntimeType एक आंतरिक प्रकार है कि आप दस्तावेज में नहीं देखेंगे है, लेकिन यह Name संपत्ति को ओवरराइड करता है। यह थोड़ा इस तरह दिखता है:

namespace System 
{ 
    internal class RuntimeType : Type, ISerializable, ICloneable 
    { 
     ... 
     public override string Name 
     { 
      get { ... } 
     } 
    } 
} 

official documentation में इस नोट को देखें:

प्रकार एक सार आधार वर्ग कि कई कार्यान्वयन की अनुमति देता है। सिस्टम हमेशा व्युत्पन्न वर्ग रनटाइम टाइप प्रदान करेगा। प्रतिबिंब में, रनटाइम शब्द से शुरू होने वाली सभी कक्षाएं सिस्टम में प्रति ऑब्जेक्ट केवल एक बार बनाई जाती हैं और समर्थन तुलना संचालन करती हैं।

1

सार संपत्ति NameMemberInfo से वास्तव में System.Type द्वारा विरासत में मिली है।

कारण System.Type इंटरफ़ेस को कार्यान्वित कर सकता है, यह है कि एक संक्षिप्त उदाहरण सदस्य को एक इंटरफ़ेस को लागू करने की अनुमति है, जब तक वह सदस्य सार्वजनिक हो, बेशक, Name है। इंटरफेस को लागू करने वाले सदस्य बेस क्लास से विरासत में प्राप्त किए जा सकते हैं।

कारण है कि System.Typeकरने की अनुमति है नहींName संपत्ति को ओवरराइड, कि System.Type ही एक अमूर्त वर्ग है। तो यह अमूर्त सदस्य को बिना किसी कार्यान्वयन के "छोड़" सकता है। इससे प्राप्त गैर-सार प्रकारों को अभी भी इस संपत्ति के लिए कार्यान्वयन करना होगा (इसके get एक्सेसर)।

जब भी आप एक चर Type t = ...; है और उस पर t.Name फोन, रन-टाइम प्रकार t की कुछ गैर सार वर्ग होना होगा, और उस वर्ग Name के एक कार्यान्वयन होगा।

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