3 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
顯然,沒(méi)有。
這是選項(xiàng):
is
和as
Type.IsSubclassOf
正如您已經(jīng)發(fā)現(xiàn)的那樣,如果兩種類型相同,這將不起作用,這是一個(gè)示例LINQPad程序,演示:
void Main(){ typeof(Derived).IsSubclassOf(typeof(Base)).Dump(); typeof(Base).IsSubclassOf(typeof(Base)).Dump();}public class Base { }public class Derived : Base { }
輸出:
TrueFalse
這表明它Derived
是一個(gè)子類Base
,但Base
(顯然)不是它自己的子類。
Type.IsAssignableFrom
現(xiàn)在,這將回答您的特定問(wèn)題,但它也會(huì)給您誤報(bào)。正如Eric Lippert在評(píng)論中指出的那樣,雖然該方法確實(shí)會(huì)回歸True
上述兩個(gè)問(wèn)題,但它也會(huì)返回True
這些問(wèn)題,您可能不希望這些問(wèn)題:
void Main(){ typeof(Base).IsAssignableFrom(typeof(Derived)).Dump(); typeof(Base).IsAssignableFrom(typeof(Base)).Dump(); typeof(int[]).IsAssignableFrom(typeof(uint[])).Dump();}public class Base { }public class Derived : Base { }
在這里你得到以下輸出:
TrueTrueTrue
最后一個(gè)True
表明,如果該方法只回答了所提出的問(wèn)題,那么它uint[]
繼承自int[]
或者它們是相同的類型,顯然不是這種情況。
所以IsAssignableFrom
也不完全正確。
is
和 as
“問(wèn)題”與is
和as
你的問(wèn)題的背景是,他們會(huì)要求你對(duì)對(duì)象進(jìn)行操作和寫直接在代碼中的類型之一,而不是與工作Type
對(duì)象。
換句話說(shuō),這將無(wú)法編譯:
SubClass is BaseClass^--+---^ | +-- need object reference here
這也不會(huì):
typeof(SubClass) is typeof(BaseClass) ^-------+-------^ | +-- need type name here, not Type object
這也不會(huì):
typeof(SubClass) is BaseClass^------+-------^ | +-- this returns a Type object, And "System.Type" does not inherit from BaseClass
結(jié)論
雖然上述方法可能符合您的需求,但您的問(wèn)題(我認(rèn)為)的唯一正確答案是您需要額外檢查:
typeof(Derived).IsSubclassOf(typeof(Base)) || typeof(Derived) == typeof(Base);
這當(dāng)然在一種方法中更有意義:
public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant){ return potentialDescendant.IsSubclassOf(potentialBase) || potentialDescendant == potentialBase;}

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果您正在嘗試在Xamarin Forms PCL項(xiàng)目中執(zhí)行此操作,則使用上述解決方案IsAssignableFrom
會(huì)出錯(cuò):
錯(cuò)誤:'Type'不包含'IsAssignableFrom'的定義,并且沒(méi)有擴(kuò)展方法'IsAssignableFrom'可以找到接受類型'Type'的第一個(gè)參數(shù)(你是否缺少using指令或匯編引用?)
因?yàn)?code>IsAssignableFrom請(qǐng)求一個(gè)TypeInfo
對(duì)象。您可以使用以下GetTypeInfo()
方法System.Reflection
:
typeof(BaseClass).GetTypeInfo().IsAssignableFrom(typeof(unknownType).GetTypeInfo())
- 3 回答
- 0 關(guān)注
- 584 瀏覽
添加回答
舉報(bào)