क्या बेस क्लास से कॉल करने पर गेटटाइप () सबसे व्युत्पन्न प्रकार लौटाएगा?


118

क्या बेस क्लास से कॉल करने पर गेटटाइप () सबसे व्युत्पन्न प्रकार लौटाएगा?

उदाहरण:

public abstract class A
{
    private Type GetInfo()
    {
         return System.Attribute.GetCustomAttributes(this.GetType());
    }
}

public class B : A
{
   //Fields here have some custom attributes added to them
}

या मुझे केवल एक अमूर्त विधि बनानी चाहिए जिसे व्युत्पन्न वर्गों को निम्नलिखित की तरह लागू करना होगा?

public abstract class A
{
    protected abstract Type GetSubType();

    private Type GetInfo()
    {
         return System.Attribute.GetCustomAttributes(GetSubType());
    }
}

public class B : A
{
   //Fields here have some custom attributes added to them

   protected Type GetSubType()
   {
       return GetType();
   }
}

10
अच्छा - क्या आपने इसे आज़माया है?
BrokenGlass

2
@BrokenGlass आम तौर पर मैं सिर्फ इतना ही करूंगा, लेकिन मैं कंप्यूटर पर नहीं हूं ... बस अपने फोन का इस्तेमाल पोस्ट बनाने के लिए कर रहा हूं क्योंकि एक समस्या का हल बनने लगा था और मैं अब जानने के लिए उत्सुक था! = पी
फिस्टी मैंगो

जवाबों:


133

GetType()वास्तविक, तत्काल प्रकार लौटाएगा। आपके मामले में, यदि आप GetType()एक उदाहरण पर कॉल करते हैं B, तो यह वापस आ जाएगा typeof(B), भले ही प्रश्न में चर को ए के संदर्भ के रूप में घोषित किया गया हो A

आपकी GetSubType()विधि का कोई कारण नहीं है ।


हालांकि यह करता है? मैं इसके (अमूर्त) सुपर क्लास से एक ऑब्जेक्ट का एक उदाहरण पारित कर रहा हूं, रिसीवर केवल सुपर क्लास को देखता है। क्या ऐसा नहीं है कि यह हमेशा वही लौटेगा जो हैंडल को उदाहरण के रूप में परिभाषित नहीं किया गया था? - या क्या मैं कुछ न कुछ भूल रहा हूं?

आह हा .. अंतर टाइपऑफ (एक्स) बनाम x.GetType () का उपयोग कर रहा हूं

22

GetTypeहमेशा वह प्रकार लौटाता है जो वास्तव में तात्कालिक था। यानी सबसे अधिक व्युत्पन्न प्रकार। इसका मतलब है कि आपका GetSubTypeव्यवहार अपने GetTypeआप की तरह है और इस तरह अनावश्यक है।

सांख्यिकीय रूप से कुछ प्रकार की जानकारी प्राप्त करने के लिए जिसका आप उपयोग कर सकते हैं typeof(MyClass)

आपके कोड में एक गलती है: System.Attribute.GetCustomAttributesरिटर्न Attribute[]नहीं Type


7

गेट टाइप हमेशा वास्तविक प्रकार लौटाता है।

इसका कारण .NET में गहरा है फ्रेमवर्क और सीएलआर , क्योंकि जेआईटी और सीएलआर .GetTypeमेमोरी में टाइप ऑब्जेक्ट बनाने के लिए विधि का उपयोग करते हैं जो ऑब्जेक्ट पर जानकारी रखता है, और ऑब्जेक्ट और संकलन तक सभी पहुंच इस प्रकार के माध्यम से हैं ।

अधिक जानकारी के लिए, Microsoft प्रेस से "CLR through C #" पुस्तक पर एक नज़र डालें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.