假設t
是System.Type
類型的變量與值解剖泛型類型
System.Collections.Generic.Dictionary`2[System.String,System.Int32]
有沒有一種方法,我可以t
稱這樣它會返回:
System.Collections.Generic.Dictionary
否則,我m想到調用.ToString()
並使用正則表達式(yuck)
假設t
是System.Type
類型的變量與值解剖泛型類型
System.Collections.Generic.Dictionary`2[System.String,System.Int32]
有沒有一種方法,我可以t
稱這樣它會返回:
System.Collections.Generic.Dictionary
否則,我m想到調用.ToString()
並使用正則表達式(yuck)
擴展在Timwi's和Vilx-'s答案,你可以寫做一些這樣的方法:
// Omitted null checking, type validation, etc. for brevity
static string GetNonGenericTypeName(Type genericType)
{
Type baseType = genericType.GetGenericTypeDefinition();
// This is PROBABLY fine since the ` character is not allowed in C# for one of
// your own types.
int stopIndex = baseType.FullName.IndexOf('`');
return baseType.FullName.Substring(0, stopIndex);
}
附錄從一個可能或可能不重要的限制來看,取決於它假設使用的範圍:它假定反向字符(')只有出現在類名中,如果它被C#編譯器放在那裏的話;換句話說,它假定它檢查的任何類別是來自BCL(我不認爲認爲包括任何類型的反向名稱,當然除了通用名稱)或用C#編寫的「正常「的方式(例如,不使用某種動態類型定義庫)。
它也適用於VB.NET和其他.NET語言,但我不太瞭解這些語言的命名規則,所以我目前無法確定。
如果你只在你自己的內部庫中使用這個方法,那麼顯然你可以控制非泛型類名中反引用的潛在存在是否現實或者甚至是可能的。如果它在公共圖書館,那麼它會容易返回不準確的結果,我稱之爲「異國情調」但完全合法的CLR類型。
可以調用GetGenericTypeDefinition()
方法,將產生「通用」型得到System.Collections.Generic.Dictionary`2
(即的typeof(Dictionary<,>)
當量)。這仍然會附加`2
。這是因爲是它編譯的實際類型名稱(2是通用參數的計數)。從那裏我認爲你別無選擇,只能使用字符串操作。 (從它的缺乏穩健性從沒有驗證輸入即使拋開)上述方法存在:
當我讀到這個問題時,我假設你想要``typeof(字典<,>)``的`Type`實例。然而,其他答案似乎假設你想** **「System.Collections.Generic.Dictionary」(我會發現怪異的,因爲它指的是一種不存在的類型)。也許你應該澄清這個問題。但是,再次,答案已經充分回答了兩種可能性。 – Timwi 2011-01-12 19:58:31