2015-10-14 9 views
13

मैं एक सामान्य इंटरफ़ेस पर एक विधि का नाम प्राप्त करने का प्रयास कर रहा हूं। मैं इस प्रकार के भाग के रूप में काम करने के लिए एक वैध typeof होगा उम्मीद करेंगे:जेनेरिक प्रकारों के साथ नाम

//This does not compile 
nameof(IGenericInterface<>.Method) 

//This would compile 
typeof(IGenericInterface<>) 

मुझे लगता है कि यह होना चाहिए वैध सी # 6 या मैं कुछ याद आ रही है या उनके ऐसा करने के लिए एक बेहतर तरीका है हूँ। मैं विधि नाम के लिए एक स्ट्रिंग का उपयोग नहीं करना चाहता हूं जैसे कि विधि का नाम बदल दिया गया है, बिना किसी बिल्ड टाइम त्रुटियों के कोड टूट जाएगा।

+0

यदि 'nameof (IGenericInterface <>) 'काम करता है तो' $" {nameof (IGenericInterface <>)} का प्रयास करें। {Nameof (विधि)} "' –

+0

यह नाम (IGenericInterface <> के समान आउटपुट का उत्पादन नहीं करेगा। विधि) विधि –

+0

[संदर्भ के लिए] वापस लौटना चाहिए (http://stackoverflow.com/questions/29878137/nameof-with-generics) – Jonesopolis

उत्तर

21

यह उम्मीद है। documentation के अनुसार, आपकी अभिव्यक्ति की अनुमति नहीं है, क्योंकि यह एक अबाध सामान्य प्रकार को संदर्भित करता है:

क्योंकि तर्क एक अभिव्यक्ति वाक्य रचना होने की जरूरत है कि सूचीबद्ध करने के लिए उपयोगी नहीं हैं अनुमति नहीं बहुत सी बातें कर रहे हैं। निम्नलिखित उल्लेख है कि उत्पादन त्रुटियों के लायक होते हैं: पूर्वनिर्धारित प्रकार (उदाहरण के, int या void के लिए), नल प्रकार (Point?), सरणी प्रकार (Customer[,]), सूचक प्रकार (Buffer*), योग्य उपनाम (A::B), और अबाध सामान्य प्रकार (Dictionary<,>), प्रीप्रोकैसिंग प्रतीकों (DEBUG), और लेबल (loop:)।

आप इस सीमा के आस-एक सामान्य पैरामीटर की आपूर्ति करके काम कर सकते हैं:

nameof(IGenericInterface<object>.Method) 

नोट: मुझे लगता है कि माइक्रोसॉफ्ट अनबाउंड सामान्य प्रकार के तरीकों के लिए संदर्भ अनुमति देने के लिए nameof सुविधा tweak चाहिए।

+2

क्या यह अजीब है, और हां मैं सहमत हूं कि उन्हें यह अनुमति देनी चाहिए कि कोई इसे कैसे उठाएगा उनको। –

+0

हुड के तहत, जेनेरिक मूल रूप से उन सभी प्रकारों में विस्तारित होते हैं जिनका उपयोग उनके साथ किया जाता है, है ना? यह शायद एक मामूली चिंता है, लेकिन कोड में 'nameof (IGenericInterface ) का उपयोग करके कोड इंटरफ़ेस' IGenericInterface 'उत्पन्न करेगा, जिसे अन्यथा कहीं भी आवश्यकता नहीं हो सकती है। यदि 'nameof() 'अनबाउंड जेनेरिक का समर्थन करेगा तो यह निश्चित रूप से अधिक समझ में आ जाएगा। –

2

संकलन के लिए बस एक नमूना प्रकार का उपयोग करें।

string name = nameof(IGenericInterface<int>.Method) // will be Method 
संबंधित मुद्दे