2011-10-20 14 views
31

संभव डुप्लिकेट:
.NET: Determine the type of “this” class in its static methodGetType

कैसे मैं एक static विधि से GetType() सुलभ बना सकते हैं?

मैं इस सार आधार वर्ग

abstract class MyBase 
{ 
    public static void MyMethod() 
    { 
     var myActualType = GetType(); // this is an instance method 
     doSomethingWith(myActualType); 
    } 
} 

और उस वर्ग के एक कार्यान्वयन है। (मैं कई कार्यान्वयन हो सकता था।)

class MyImplementation : MyBase 
{ 
    // stuff 
} 

मैं myActualType कैसे प्राप्त typeof(MyImplementation) होने के लिए कर सकते हैं?

+3

मुझे नहीं लगता कि आप इसे एक साधारण मामले में कर सकते हैं। एक सवाल हालांकि, आप यह क्यों चाहते हैं? स्थैतिक तरीकों के साथ बिंदु यह है कि उन्हें चलाने के लिए एक उदाहरण की आवश्यकता नहीं है, है ना? तो यह बात क्यों मायने रखती है? शायद आपकी समस्या को पूरी तरह से अलग तरीके से हल किया जा सकता है। – Alxandr

+1

मैं एक एमवीसी अनुप्रयोग के लिए मार्ग पंजीकृत करने के लिए एक सुविधाजनक तरीका लिखने की कोशिश कर रहा हूं - मैं उन्हें नामस्थान द्वारा प्रतिबंधित करने की कोशिश कर रहा हूं। इसका सार है क्योंकि मैं चाहता हूं कि आपका आवेदन कंक्रीट कार्यान्वयन का मालिक हो। –

+0

फिर इसे स्थिर के रूप में न लिखें, बल्कि इसके बजाय एक विधि के रूप में। फिर आप आसानी से 'GetType() 'के माध्यम से प्रकार प्राप्त कर सकते हैं। – Alxandr

उत्तर

2

यह वह पैटर्न है जिसका मैंने उपयोग किया था।

abstract class MyBase 
{ 
    public static void MyMethod(Type type) 
    { 
     doSomethingWith(type); 
    } 
} 
35

एक स्थिर विधि के भीतर "प्रकार" हमेशा विशिष्ट प्रकार होता है, क्योंकि वर्चुअल स्थिर विधि जैसी कोई चीज़ नहीं होती है।

आपके मामले में, इसका मतलब है आप बस लिख सकते हैं:

var myActualType = typeof(MyBase); 

MyMethod के "प्रकार" के बाद से, एक स्थिर किया जा रहा है, हमेशाMyBase की एक स्थिर तरीका है।

+1

हाय रीड - मुझे लगता है कि ऊपर दिए गए आपके समाधान के साथ समस्या यह है कि उप-वर्ग प्रकार के बावजूद 'myActualType' को 'MyBase' प्रकार पर सेट किया जाएगा। यदि मैं मूल प्रश्न को सही ढंग से समझता हूं, तो मुझे लगता है कि पोस्टर मौजूदा वर्ग के प्रकार का उपयोग करने के लिए 'MyMethod' विधि' प्राप्त करने का प्रयास कर रहा है। – matt

+2

@ mjd79: हाँ - लेकिन यह मेरा मुद्दा है - एक स्थिर विधि हमेशा बेस प्रकार में टाइप की जा रही है, क्योंकि एक स्थिर विधि प्रकार का हिस्सा है, विधि का उपयोग कर वर्ग नहीं ... –

+0

मेरे जैसे लोगों के लिए जावा 'MyType.class' के बराबर चाहते हैं, यह आपके लिए जवाब है। –

19

इसके बारे में क्या?

abstract class MyBase<T> 
{ 
    public static void MyMethod() 
    { 
     var myActualType = typeof(T); 
     doSomethingWith(myActualType); 
    } 
} 


class MyImplementation : MyBase<MyImplementation> 
{ 
    // stuff 
} 
+4

'कक्षा बार: माईबेस ' करने से आपको क्या रोकता है? –

+0

आह, यह एक उत्कृष्ट बिंदु है! मुझे लगता है कि सम्मेलन ही एकमात्र चीज है जो इस काम को बनाती है, लेकिन आप सही हैं, अगर कोई इस तरह कक्षा घोषित करता है, तो 'MyMethod' विधि अपेक्षित रूप से काम नहीं करेगी। – matt

+3

हम https://msdn.microsoft.com/en-us/library/d5x73970.aspx के अनुसार 'टी: <बेस क्लास नाम>' कर सकते हैं। – John

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