5

microsoft documentation से Type.GetType .NET 4.5 में केस-असंवेदनशील हो सकता है। दुर्भाग्यवश, यह WinRT (मेट्रो/आधुनिक यूआई/स्टोर ऐप्स) में उपलब्ध नहीं है।टाइप। गेट टाइप प्रकार असंवेदनशील - WinRT

क्या कोई ज्ञात कामकाज है? क्योंकि मुझे प्रोटोकॉल से ऑब्जेक्ट्स को तुरंत चालू करना है जिसमें अपरकेस में सभी स्ट्रिंग प्रस्तुतियां हैं।

उदाहरण: "MYOBJECT" से, मुझे MyObject को तुरंत चालू करना होगा।

मैं वर्तमान में Activator.CreateInstance(Type.GetType("MYOBJECT")) का उपयोग करता हूं, लेकिन मामले संवेदनशीलता के कारण, यह काम नहीं करता है।

धन्यवाद

उत्तर

5

आप विधानसभा आप से प्रकार लोड कर रहे हैं पता है? यदि ऐसा है, तो आप एक बार Assembly.GetTypes() पर कॉल करके एक केस-असंवेदनशील Dictionary<string, Type> (StringComparer.OrdinalIgnoreCase का उपयोग कर) बना सकते हैं।

// You'd probably do this once and cache it, of course... 
var typeMap = someAssembly.GetTypes() 
          .ToDictionary(t => t.FullName, t => t, 
             StringComparer.OrdinalIgnoreCase); 

... 

Type type; 
if (typeMap.TryGetValue(name, out type)) 
{ 
    ... 
} 
else 
{ 
    // Type not found 
} 

संपादित करें:: - तो फिर तुम सब पर Type.GetType() उपयोग करने के लिए की जरूरत नहीं है बस शब्दकोश से परामर्श देखने के बाद कि ये एक ही नाम स्थान में सभी कर रहे हैं, आप आसानी से फ़िल्टर कर सकते हैं:

var typeMap = someAssembly.GetTypes() 
          .Where(t => t.Namespace == "Foo.Bar") 
          .ToDictionary(t => t.Name, t => t, 
             StringComparer.OrdinalIgnoreCase); 
+0

@NicolasVoron का उपयोग करें? बस कितने प्रकार हैं, और आप कितने ला रहे हैं? (मुझे लगता है कि आप नाम से कई अलग-अलग प्रकार ला रहे थे।) –

+0

हम्म ... पूरी तरह से आपके उत्तर को गलत समझा। उसके लिए माफ़ करना। यह एक बहुत अच्छा समाधान है। आपका संपादन पूरी तरह से मेरी जरूरतों के अनुरूप फिट बैठता है;) बहुत बहुत धन्यवाद! –

4

आप GetTypes() विधि का उपयोग कर सकते हैं, जहां आपके प्रकार का असेंबली असेंबली में सभी संभावित प्रकार लाने के लिए, उस चेक के बाद जो आपके प्रकार के ऊपरी मामले के बराबर है, उसके बाद GetType विधि में इसका उपयोग करें।

0

मान लें कि आप वास्तविक वर्ग का नाम Car है और आपकी क्वेरी स्ट्रिंग CAR है। चूंकि ये केस संवेदनशीलता के मामले में अलग हैं, Type.GetType() शून्य वापस आ जाएगा। सभी फ़िल्टरों में से सभी को Car के नामस्थान से सभी वर्गों को हल करने के लिए (मान लें कि नामस्थान Vehicle है)। एक List

List<Type> lstClasses = varClasses.ToList(); 

को

var varClasses = from t in Assembly.GetExecutingAssembly().GetTypes() 
       where t.IsClass && t.Namespace == "Vehicles" 
       select t; 

Convert एक चर घोषित वर्ग का वास्तविक नाम हो जाते हैं और बिना मामले संवेदनशीलता स्ट्रिंग तुलना करने के लिए एक पाश का उपयोग करें। क्यों यह दर्द होगा:

string strActualName = ""; 
foreach (Type t in lstClasses) 
{ 
    if (t.Name.ToLower() == "CAR".ToLower()) 
    { 
      strActualName = t.Name; 
      break; 
    } 
} 

अब नए तार के साथ, Type.GetType()

Type t1 = Type.GetType("Vehicles." + strActualName); 
संबंधित मुद्दे