5

microsoft documentation,Type.GetType在.NET 4.5中可能不區分大小寫。不幸的是,這在WinRT(Metro/Modern UI/Store應用程序)中不可用。Type.GetType不區分大小寫 - WinRT

是否有已知的解決方法?因爲我必須從協議中實例化所有字符串表示形式爲大寫的對象。

例如:從「MYOBJECT」中,我必須實例化MyObject

我目前使用Activator.CreateInstance(Type.GetType("MYOBJECT")),但由於區分大小寫,它不起作用。

謝謝

回答

5

你知道你正在加載類型的程序集嗎?如果是這樣,您可以通過調用Assembly.GetTypes()一次創建不區分大小寫的Dictionary<string, Type>(使用StringComparer.OrdinalIgnoreCase)。那麼你就需要使用Type.GetType()在所有 - 只是查字典:

// 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 
} 

編輯:我們已經看到,這些都在同一個命名空間,你可以很容易地篩選:

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()將返回null。 要解決這個問題,首先要從Car的名稱空間過濾所有的類(假定名稱空間爲Vehicle)。

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

轉換爲List

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

聲明一個變量來獲取類的實際名稱和使用循環不區分大小寫比較字符串。

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);