2011-01-12 84 views
0

假設tSystem.Type類型的變量與值解剖泛型類型

System.Collections.Generic.Dictionary`2[System.String,System.Int32] 

有沒有一種方法,我可以t稱這樣它會返回:

System.Collections.Generic.Dictionary 

否則,我m想到調用.ToString()並使用正則表達式(yuck)

+0

當我讀到這個問題時,我假設你想要``typeof(字典<,>)``的`Type`實例。然而,其他答案似乎假設你想** **「System.Collections.Generic.Dictionary」(我會發現怪異的,因爲它指的是一種不存在的類型)。也許你應該澄清這個問題。但是,再次,答案已經充分回答了兩種可能性。 – Timwi 2011-01-12 19:58:31

回答

1

擴展在Timwi'sVilx-'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類型。

2

沒有System.Collections.Generic.Dictionary。但是你可以通過調用

t.GetGenericTypeDefinition() 
+1

如果他修改了他的問題,所以他的第二個片段顯示「System.Collections.Generic.Dictionary <>」,那麼你的答案是絕對正確的。 – Amy 2011-01-12 19:23:38

+0

是的,你的答案真的是我需要的(即我只需要一個我可以可靠比較的字符串),但我必須標記答案,技術上確實回答我的問題完全如書面(我upvoted你:)) – JoelFan 2011-01-12 20:31:35

1

可以調用GetGenericTypeDefinition()方法,將產生「通用」型得到System.Collections.Generic.Dictionary`2(即的typeof(Dictionary<,>)當量)。這仍然會附加`2。這是因爲它編譯的實際類型名稱(2是通用參數的計數)。從那裏我認爲你別無選擇,只能使用字符串操作。 (從它的缺乏穩健性從沒有驗證輸入即使拋開)上述方法存在: