2013-08-06 13 views
7

हम विजुअल स्टूडियो कोड मॉडल का उपयोग कर रहे हैं और कोडटाइप के जेनेरिक पैरामीटर प्राप्त करने में कुछ समस्याएं हैं। FullName खुद को पार्स किए बिना उन्हें कैसे प्राप्त करें?कोडटाइप जेनेरिक पैरामीटर

यह संकेत दिया है How can I get the generic constraints from CodeInterface as a CodeType object? में (हालांकि एक जवाब के रूप में चिह्नित नहीं) कोई दूसरा रास्ता नहीं है कि वहाँ है, तथापि, यह नहीं वास्तव में विश्वसनीय है के रूप में:

System.Func<Outer.Inner>

परिभाषित नहीं किया जाएगा: यदि यह नहीं जान सकते सामान्य पैरामीटर पार्स है (Outer.Inner) नाम स्थान Outer एक वर्ग Inner युक्त करने के लिए बात कर रहा है या यह वर्ग Outer लिए बात कर रहा है, तो एक आंतरिक वर्ग Inner होने (और हाँ, यह ऐसे मामलों में Outer+Inner नहीं है)।

यदि कोई व्यक्ति कम से कम जानता है कि + साइन के साथ नेस्टेड कक्षाओं को दिखाने के लिए पूर्ण नाम संपत्ति को कैसे बताना है तो यह भी बहुत अच्छा होगा।

उत्तर

0

मुझे लगता है कि answer here बहुत निश्चित है। यह डीटीई या डीटीई 2 द्वारा समर्थित नहीं है और भविष्य में समर्थित होने की संभावना नहीं है।

रोज़लिन का उपयोग करने का एकमात्र तरीका है, जो कि उन लोगों के लिए स्वीकार्य नहीं है जो प्री-रिलीज सॉफ़्टवेयर का उपयोग नहीं करना चाहते हैं। मैंने यह भी नहीं देखा है कि किस प्रकार की निर्भरताएं लागू होंगी (क्या मेरे घटक के उपयोगकर्ताओं को रोज़लिन स्थापित करने की आवश्यकता है?)।

पूर्ण नाम स्ट्रिंग से प्रकार प्राप्त करने के लिए नियमित अभिव्यक्ति का उपयोग कर सकता है। लेकिन, वास्तविक दुनिया में हममें से उन लोगों के लिए जिन्हें टोकन (T) कंक्रीट प्रकार (System.String) मैपिंग के लिए आवश्यक है, यह एक विकल्प नहीं है।

0

मुझे किसी भी सामान्य प्रकार के लिए ऐसा करने का कोई तरीका नहीं मिल रहा है, लेकिन यदि आपको किसी विशिष्ट प्रकार के लिए ऐसा करने की आवश्यकता है, तो कुछ मामलों में यह संभव है।

उदाहरण के लिए, मैं अगर एक प्रकार एक संग्रह है की जाँच करने के लिए निम्न कोड है, और अगर ऐसा है, तत्व प्रकार मिलता है:

private static bool IsCollectionType(CodeType type, out CodeType elementType) 
    { 
     // string implements IEnumerable<char>, but we don't want to treat it as a collection 
     if (type.FullName == "System.String") 
     { 
      elementType = null; 
      return false; 
     } 

     var enumerable = type.Bases.OfType<CodeInterface>().FirstOrDefault(i => i.FullName.StartsWith("System.Collections.Generic.IEnumerable<")); 
     var method = enumerable?.Members.OfType<CodeFunction>().FirstOrDefault(m => m.Name == "GetEnumerator"); 
     var enumerator = method?.Type.CodeType; 
     var current = enumerator?.Members.OfType<CodeProperty>().FirstOrDefault(m => m.Name == "Current"); 
     if (current != null) 
     { 
      elementType = current.Type.CodeType; 
      return true; 
     } 

     elementType = null; 
     return false; 
    } 

आप देख सकते हैं, मैं सीधे में नहीं देख रहा हूँ सामान्य प्रकार तर्क, लेकिन इसके बजाय मैं IEnumerable<T>.GetEnumerator().Current के प्रकार को देखता हूं। बेशक, इस प्रकार के बारे में विशिष्ट ज्ञान की आवश्यकता है जिसके साथ आप काम कर रहे हैं।

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