2012-03-22 153 views
0

我有一個基類,需要一個泛型類型。這可以是EntityObject或自定義類型的礦。
我需要一種方法來將Base類約束到其他類型,並且我還需要一種方法來檢查Generic是否屬於某種類型。
當我做if (T is EntityObject)if (typeof(T) is EntityObject)它或者說我使用T作爲變量,或者爲typeof(T)我得到它「永遠不會是給定類型」。多重約束類型或檢查通用是什麼類型?

回答

2

您可以使用:根據您的要求

if (typeof(T) == typeof(EntityObject)) 

if (typeof(EntityObject).IsAssignableFrom(typeof(T))) 

。 (有關更多詳細信息,請參閱Type.IsAssignableFrom的文檔。)

當然,這是一次執行時間檢查 - 在編譯時您不能有「一個......」約束。根據你的情況,最好有兩個不同名稱和約束的公共方法,它們調用一個不受約束的私有方法(由於只從公共方法中調用,「知道」你有適當的類型)。

+0

如果我想檢查的第二種類型實際上是一個基類,這個封面會覆蓋嗎? T實際上是「MyObject」,但我將檢查MyObject繼承的「MyBase」。 – 2012-03-22 14:51:07

+0

@ JamesP.Wright'typeof(MyBase).IsAssignableFrom(typeof(T))'應該返回true,如果'T'是'MyBase'的子類 – 2012-03-22 15:09:25

0

沒有辦法約束兩個不相關的類型。您可能需要一個通用類型(如接口)或受約束泛型類的兩個版本。

假設T不受約束,可以使用if (typeof(T).Equals(typeof(EntityObject))) { ... }來檢查T是否屬於某種類型。