C # का अपना वर्ग नाम प्राप्त करना


464

यदि मेरे पास एक वर्ग है MyProgram, तो क्या स्ट्रिंग के रूप में " MyProgram " प्राप्त करने का एक तरीका है ?

जवाबों:


743

इसे इस्तेमाल करे:

this.GetType().Name

36
यदि आप एक स्थिर पद्धति में हैं तो डेवलपर को पता है कि प्रकार का नाम क्या है। आप इसे स्रोत कोड में एक स्ट्रिंग के रूप में टाइप कर सकते हैं।
एरिक लिपर्ट

122
@EricLippert: यदि आप नाम टाइप करते हैं, तो कंपाइलर इसे पकड़ नहीं पाएगा अगर क्लास का नाम बदल दिया जाए।
हलवार्ड

12
@ हवलदार: सबसे पहले, यदि वर्तमान विधि में स्थिर विधि है तो नाम वैकल्पिक है; यदि आप इसे बदलने के बारे में चिंतित हैं, तो इसे छोड़ दें। दूसरा, विजुअल स्टूडियो अपने आप आपको एक स्मार्ट टैग दे देगा जब आप एक वर्ग का नाम बदलते हैं जो इसके सभी उदाहरणों का नाम बदल देता है। और तीसरा, यदि आप एक वर्ग का नाम बदल रहे हैं तो ऑड्स अच्छे हैं आप पहले से ही बहुत सारे स्थानों में बहुत सारे बदलाव करने जा रहे हैं।
एरिक लिपर्ट

12
@EricLippert आप सही हैं। Visual Studio या ReSharper का कोई भी नया संस्करण उसी नाम के साथ तार को पकड़ लेगा, जिस नाम का वर्ग बदला जा रहा है। मेरी पिछली टिप्पणी अभी कुछ पुरानी है, अब बेकार ज्ञान है ...
हाल्वार्ड

17
@ हेल्वर्ड: ... और सी # 6 में आप नए nameofऑपरेटर का उपयोग कर सकते हैं ।
एरिक लिपर्ट

238

मैं इसे अच्छे उपाय के लिए फेंकना चाहता था। मुझे लगता है कि @micahtan पोस्ट करने का तरीका पसंद किया जाता है।

typeof(MyProgram).Name

24
यह वास्तव में बेहतर है, क्योंकि: 1. यह स्थिर संदर्भ में काम करेगा। 2. यह संकलित समय की गणना है, इसलिए यह प्रतिबिंब की तरह खर्च नहीं करता है
गिल्बर्ट

6
@JimBalter इसके कई फायदे हैं: 1. स्टेटिक संदर्भ। 2. हर बार सीएलआर द्वारा प्रकार के भाग का पुनर्मूल्यांकन नहीं किया जाएगा - यह एमएसआईएल को लिखा जाएगा। 3. यह आपको किसी नए "गेटटेप ()" की घोषणा करने से बचाता है।
गिल्बर्ट

11
यदि आप विरासत में मिला वर्ग का नाम लेना चाहते हैं और यह कॉल अभिभावकों में है तो यह काम नहीं करेगा।
Gh61

10
यह स्पष्ट रूप से प्रकार को संदर्भित करने का नुकसान है, जो इसे आसानी से पुन: प्रयोज्य बनाता है।
cprcrack

20
C # 6.0 या बाद में आप कर सकते हैं nameof(MyProgram)
ओवेन जॉनसन

190

C # 6.0 के साथ, आप nameofऑपरेटर का उपयोग कर सकते हैं :

nameof(MyProgram)

4
उत्तम सामग्री; टाइप सदस्यों (जैसे कि विधियाँ और गुण) और यहाँ तक कि चर के साथ भी काम करता है - डॉक्स देखें ।
mklement0

127

हालांकि माइकाटान का जवाब अच्छा है, यह स्थिर तरीके से काम नहीं करेगा। यदि आप वर्तमान प्रकार का नाम पुनः प्राप्त करना चाहते हैं, तो यह हर जगह काम करना चाहिए:

string className = MethodBase.GetCurrentMethod().DeclaringType.Name;

2
अच्छी पकड़ है, हालांकि मुझे लगता है कि इस मामले में मेरा तरीका पसंद किया जाता है।
चोसपंडियन

5
यह गैर-आभासी तरीकों के लिए काम नहीं करेगा, क्योंकि यह उस प्रकार का नाम लौटाएगा जिस विधि को घोषित किया गया है और (संभवतः उत्तराधिकार श्रृंखला में) कार्यान्वित किया गया है, न कि उस ठोस प्रकार का उदाहरण जिसे आप वास्तव में कोड निष्पादित कर रहे हैं। से।
चार्ल्स ब्रेटाना

1
यह DNX (Dot Net Execution) फ्रेमवर्क में अब काम नहीं करता है। उन्होंने GetCurrentMethod () पद्धति को हटा दिया और केवल GetMethodFromHandle () छोड़ दिया।
अस्तार

यह वही है जो मुझे एक वंशज में एक आभासी फ़ंक्शन से वर्तमान में निष्पादित कोड के ठोस वर्ग का नाम प्राप्त करने के लिए आवश्यक था।
DrFloyd5

15

संदर्भ के लिए, यदि आपके पास एक प्रकार है जो दूसरे से विरासत में मिला है तो आप इसका उपयोग भी कर सकते हैं

this.GetType().BaseType.Name

12

यदि आपको व्युत्पन्न वर्गों में इसकी आवश्यकता है, तो आप उस कोड को आधार वर्ग में रख सकते हैं:

protected string GetThisClassName() { return this.GetType().Name; }

फिर, आप व्युत्पन्न वर्ग में नाम तक पहुँच सकते हैं। व्युत्पन्न वर्ग का नाम। बेशक, नए कीवर्ड "नेमॉफ़" का उपयोग करते समय, इस तरह के कार्यों की आवश्यकता नहीं होगी।

इसके अलावा आप इसे परिभाषित कर सकते हैं:

public static class Extension
{
    public static string NameOf(this object o)
    {
        return o.GetType().Name;
    }
}

और फिर इस तरह का उपयोग करें:

public class MyProgram
{
    string thisClassName;

    public MyProgram()
    {
        this.thisClassName = this.NameOf();
    }
}

10

इसे इस्तेमाल करो

माना कि आवेदन Test.exe चल रहा है और समारोह है foo () में Form1 [मूल रूप से यह है वर्ग Form1 ], तो कोड के ऊपर प्रतिक्रिया नीचे उत्पन्न होगा।

string s1 = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;

यह वापस आ जाएगी।

s1 = "TEST.form1"

फ़ंक्शन नाम के लिए:

string s1 = System.Reflection.MethodBase.GetCurrentMethod().Name;

वापस होगा

s1 = foo 

ध्यान दें कि आप इसका उपयोग अपवाद उपयोग में करना चाहते हैं:

catch (Exception ex)
{

    MessageBox.Show(ex.StackTrace );

}

DeclaringType घोषित किया गया है, [Nullable(2)]इसलिए आपको एक चेतावनी मिलती है जब अशक्त जाँच सक्रिय होती है।
मार्टिन

@Martin, कृपया अपनी टिप्पणी स्पष्ट करें। मुझे नहीं मिला?
नं

2

thisछोड़ा जा सकता है। आपको वर्तमान वर्ग का नाम प्राप्त करने की आवश्यकता है:

GetType().Name

2

Asp.net की वर्तमान श्रेणी का नाम प्राप्त करें

string CurrentClass = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString();

1
DeclaringType घोषित किया गया है, [Nullable(2)]इसलिए आपको एक चेतावनी मिलती है जब अशक्त जाँच सक्रिय होती है।
मार्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.