पूर्ण नाम स्थान के बिना टाइप नाम प्राप्त करें


293

मेरे पास निम्नलिखित कोड हैं:

return "[Inserted new " + typeof(T).ToString() + "]";

परंतु

 typeof(T).ToString()

नाम सहित पूरा नाम देता है

वहाँ वैसे भी सिर्फ वर्ग नाम (किसी भी नामस्थान क्वालिफायर के बिना) पाने के लिए है?


7
संयोग से, लेखन string1 + anything.ToString() + string2निरर्थक है। ToStringयदि आप करते हैं तो संकलक स्वचालित रूप से कॉल सम्मिलित करता है string1 + anything + string2
टिम रॉबिन्सन

13
कठोर ध्वनि के लिए नहीं, लेकिन, क्या आपने निरीक्षण किया था कि कौन से गुण Typeउदाहरण पर उपलब्ध हैं (जैसे कि लौटा typeof(..)) मुझे पूरा यकीन है कि आप इसे स्वयं समझ
लेंगे

जवाबों:


530
typeof(T).Name // class name, no namespace
typeof(T).FullName // namespace and class name
typeof(T).Namespace // namespace, no class name

5
Nameप्रकार के मापदंडों पर विचार नहीं करता है।
gregsdennis

73
या this.GetType().Name, this.GetType().FullNameआदि अगर उदाहरणों के साथ काम कर रहे हैं।
अवेनमोर डे

1
Nameनेस्टेड प्रकारों पर भी विचार नहीं करता है!
वॉरिएंट चिंपांज़ी

33

सामान्य प्रकारों के लिए टाइप पैरामीटर प्राप्त करने के लिए इसे आज़माएँ:

public static string CSharpName(this Type type)
{
    var sb = new StringBuilder();
    var name = type.Name;
    if (!type.IsGenericType) return name;
    sb.Append(name.Substring(0, name.IndexOf('`')));
    sb.Append("<");
    sb.Append(string.Join(", ", type.GetGenericArguments()
                                    .Select(t => t.CSharpName())));
    sb.Append(">");
    return sb.ToString();
}

शायद (समाधान के कारण) सबसे अच्छा समाधान नहीं है, लेकिन यह काम करता है। आउटपुट जैसे दिखते हैं:

Dictionary<String, Object>

3
इसे स्वीकृत उत्तर माना जाना चाहिए क्योंकि यह ठीक प्रकार से सामान्य प्रकारों को ध्यान में रखता है जो पुनरावृत्ति हो सकता है (शब्दकोश <int ?, int?> उदाहरण के लिए)।
ओटिस

अवधारणा के लिए +1। लेकिन असफल समयपूर्व अनुकूलन को नापसंद करते हैं। यह प्रत्येक पुनरावर्ती कॉल (यहां तक ​​कि अप्रयुक्त होने पर भी आधार मामले) में एक नया बनाता है StringBuilder, फिर भी string.Joinअस्थायी और LINQ लैम्ब्डा को अनदेखा करता है । Stringजब तक आप जानते हैं कि यह एक अड़चन है तब तक उपयोग करें । / शेख़ी
निगेल टच

1
निगेल, यह सही कहता है कि शायद सबसे अच्छा समाधान नहीं है :)
ग्रैग्स्सडेन

शॉर्टनेम एक छोटा नाम है :)
वलेरा



5

C # 6.0 के बाद (सहित) आप nameof अभिव्यक्ति का उपयोग कर सकते हैं :

using Stuff = Some.Cool.Functionality  
class C {  
    static int Method1 (string x, int y) {}  
    static int Method1 (string x, string y) {}  
    int Method2 (int z) {}  
    string f<T>() => nameof(T);  
}  

var c = new C()  

nameof(C) -> "C"  
nameof(C.Method1) -> "Method1"   
nameof(C.Method2) -> "Method2"  
nameof(c.Method1) -> "Method1"   
nameof(c.Method2) -> "Method2"  
nameof(z) -> "z" // inside of Method2 ok, inside Method1 is a compiler error  
nameof(Stuff) = "Stuff"  
nameof(T) -> "T" // works inside of method but not in attributes on the method  
nameof(f) -> f  
nameof(f<T>) -> syntax error  
nameof(f<>) -> syntax error  
nameof(Method2()) -> error This expression does not have a name  

ध्यान दें! nameofअंतर्निहित ऑब्जेक्ट का रनटाइम प्रकार नहीं मिलता है, यह सिर्फ संकलन-समय तर्क है। यदि कोई विधि IEnumerable को स्वीकार करती है तो nameof केवल "IEnumerable" देता है, जबकि वास्तविक वस्तु "सूची" हो सकती है।


3
nameofका नाम नहीं हैType
निगेल टच

@NigelTouch मैंने जांच की है और nameofउसका नाम वापस कर दिया है Type, स्क्रीनशॉट प्रूफ के साथ: prntscr.com/irfk2c
Stas Boyarincev

1
क्षमा करें, मैंने अच्छी तरह से समझाया नहीं। मेरा मतलब यह है कि इसे अंतर्निहित वस्तु का रनटाइम नहीं मिलता है Type, यह केवल संकलन-समय तर्क है। यदि कोई विधि स्वीकार करती है IEnumerableतो nameofबस "IEnumerable" देता है, जबकि वास्तविक वस्तु "सूची <string>" हो सकती है। यह नहीं लगता कि यह ओपी के सवाल का जवाब देता है।
निगेल टच

-2

उपयोग करने का सबसे अच्छा तरीका:

obj.GetType().BaseType.Name

1
कृपया अपने उत्तर के लिए कुछ स्पष्टीकरण प्रदान करें, ताकि यह अन्य उपयोगकर्ताओं के लिए अधिक स्पष्ट हो सके।
स्टेनिस्लाव मेखोनोशिन

मैंने एक बार "GetType ()। Name" को एक वर्चुअल फंक्शन के अंदर लिखा है। क्या कोई मुझे समझा सकता है कि उसके पास obj.GetType () क्यों नहीं है। BaseType.Name? मैं सीख रहा हूँ। मैं उद्देश्य को समझता हूं लेकिन सभी वाक्यविन्यास विवरण नहीं। धन्यवाद।
डिएगो ओरेलाना

आधार प्रकार का इससे क्या लेना-देना है?
जॉनी 5

मेरा टेस्ट obj.GetType().BaseType.Nameरिटर्न "TypeInfo"जो वांछित समाधान नहीं है जैसा कि मुझे उम्मीद है।
नसेंबेर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.