2008-10-28 72 views
1

的類型,我有以下類獲取泛型參數

public interface InterfaceBase 
{ 
} 

public class ImplementA:InterfaceBase 
{ 
} 

public class ImplementB:InterfaceBase 
{ 
} 

public void TestImplementType<T>(T obj) where T: InterfaceBase 
{ 
} 

如何推斷T是什麼是否ImplementA或ImplementB?我試着用

typeof(T) is ImplementA 

但是這個表達式總是被評估爲false。

編輯:我如何將obj投射到ImplementA或ImplementB?

回答

4

obj is ImplementA

+2

再次,不說是t從ImplementA派生 - 只會談AB out obj的特殊價值。 TestImplementType (新的ImplementA())將通過(根據實際問題)它不應該。 – 2008-10-28 07:06:20

0

如何:

if(obj.GetType().Equals(typeof(ImplementA))) 
{ 
    // ... 
} 
+0

這不是一回事。例如,你可以調用: TetstImplementType (new ImplementA()) – 2008-10-28 06:31:00

4

typeof(T)返回TType - 和System.Type沒有實現ImplementA。你想要的是:

if (typeof(ImplementA).IsAssignableFrom(typeof(T)) 
{ 
} 
9

嚴格地說,你應該避免在泛型中有太多的專業化。將任何專門的邏輯放在接口中的成員上會更乾淨,這樣任何實現都可以以不同的方式實現。不過,也有多種方式:

您可以測試 「目標文件」(假設它是不爲空)

bool testObj = obj is ImplementA; 

您可以測試T代表是typeof運算(ImplementA):

bool testEq = typeof(T) == typeof(ImplementA); 

同樣可以測試它是ImplementA或子類:

bool testAssign = typeof(ImplementA).IsAssignableFrom(typeof(T));