मुझे जेनेरिक प्रकार के तर्क का प्रकार नाम कैसे मिलता है?


99

अगर मेरे पास मेथड सिग्नेचर जैसा है

public string myMethod<T>( ... )

मैं विधि के अंदर, उस प्रकार का नाम कैसे प्राप्त कर सकता हूं जिसे प्रकार तर्क के रूप में दिया गया था? मैं ऐसा ही कुछ करना चाहता हूं typeof(T).FullName, लेकिन यह वास्तव में काम करता है ...


10
typeof(T).FullName काम करना चाहिए । इसके बजाय क्या हो रहा है?
नाथन टेलर

मुझे उस कथन पर कंपाइलर त्रुटियां मिलीं - लेकिन जाहिर तौर पर वे किसी और चीज के कारण थे, क्योंकि अब यह काम कर रहा है। धन्यवाद!
टॉमस एशचन

जवाबों:


158

आपका कोड काम करना चाहिए। typeof(T).FullNameपूरी तरह से वैध है। यह पूरी तरह से संकलित, कार्यशील कार्यक्रम है:

using System;

class Program 
{
    public static string MyMethod<T>()
    {
        return typeof(T).FullName;
    }

    static void Main(string[] args)
    {
        Console.WriteLine(MyMethod<int>());

        Console.ReadKey();
    }

}

उपरोक्त प्रिंट चलाना (उम्मीद के मुताबिक):

System.Int32

MyMethod <int >> () के साथ इसका परीक्षण करना सुनिश्चित करें और देखें कि आपको क्या मिलता है ... यदि आपको उस परिदृश्य में अंतर्निहित प्रकार की परवाह है तो आपको अशक्त प्रकारों का ध्यान रखना होगा।
GR7

1
आपका मतलब है " <int?>" यदि ऐसा है, तो यह काम करता है, लेकिन आपको System.Nullable<int>(पूर्ण नाम सिंटैक्स में) मिलता है, जो कि आप उम्मीद करेंगे ...
रीड कोप्स

भले ही मेरे पास पहले से ही समाधान था (हालांकि यह किसी कारण से काम नहीं किया ...), मैं आपको सबसे अच्छा उत्तर लिखने के लिए प्रतिनिधि अंक दूंगा =)
टॉमस असचन

1
यह सिर्फ मुझे मदद मिली के बाद से मुझे लगता है कि मान लिया nameof(T)और typeof(T).Nameएक ही बात करना होगा। पता चला है nameof(T)सिर्फ रिटर्न T
दाहवेद at

5

typeof(T).Nameऔर typeof(T).FullNameमेरे लिए काम कर रहे हैं। मैं तर्क के रूप में पारित प्रकार प्राप्त करता हूं।


1
आह। यदि आपके द्वारा दिया गया प्रकार अशक्त है, तो अंतर्निहित प्रकार प्राप्त करने के लिए आपको टाइपोफ़ (T) .GetGenericArguments () [0]
GR7

यह जाँचने के लिए कि यदि प्रकार अशक्त है, तो आप टाइपोफ़ (T) .IGGenericType का उपयोग करेंगे, और यदि यह है, तो आप नाम या फ़्लूनेम ((प्रकार) टाइपोफ़) (टी) .GetenerenerArguments () [0] प्राप्त करने के लिए निम्नलिखित का उपयोग करेंगे। ])
.नाम

1

मान लें कि आपके पास उपलब्ध T का कुछ उदाहरण है, यह किसी भी अन्य प्रकार से अलग नहीं है।

var t = new T();

var name = t.GetType().FullName;

2
आपको T की एक आवृत्ति की भी आवश्यकता नहीं है .... टाइपोफ़ (T) बिना किसी उदाहरण के ठीक काम करता है ... यदि कोई उपवर्ग विधि (एक तर्क के रूप में) में पारित हो जाता है तो आपका व्यवहार अलग होगा।
रीड कोपसे

1
उस कोड के साथ समस्या यह है कि यदि टी में एक पैरामीटर रहित निर्माता नहीं है तो यह काम नहीं करेगा।
नाथन टेलर

@ नथन - यह केवल एक उदाहरण था कि टी। का उदाहरण दिया जा सकता है। संभवतः एक जेनेरिक पद्धति पर उसे कुछ टी प्रकार उपलब्ध होंगे। @ लीड - आप निश्चित रूप से सही हैं, मैंने मान लिया था कि आखिर वह क्या था।
womp

एक और मुद्दा इस मामले में होगा कि टी एक अमूर्त वर्ग या एक इंटरफ़ेस है - उपरोक्त कोड काम नहीं करेगा। इस मामले में कि एक सामान्य प्रकार की बाधा है ("जहां") तब इस प्रकार का कोड सुरक्षित हो सकता है क्योंकि हम कंस्ट्रक्टर को जानते हैं और वास्तव में टाइप को तत्काल करने के लिए कारण हो सकते हैं। इसके अलावा तात्कालिकता व्यर्थ है।
एंड्रयू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.