第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何檢查類型是子類型還是對(duì)象類型?

如何檢查類型是子類型還是對(duì)象類型?

縹緲止盈 2019-08-24 18:04:56
如何檢查類型是子類型還是對(duì)象類型?要檢查類型是否是C#中另一種類型的子類,很容易:typeof (SubClass).IsSubclassOf(typeof (BaseClass)); // returns true但是,這將失敗:typeof (BaseClass).IsSubclassOf(typeof (BaseClass)); // returns false有沒(méi)有辦法檢查類型是否是基類本身的子類OR,而不使用OR運(yùn)算符或使用擴(kuò)展方法?
查看完整描述

3 回答

?
皈依舞

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊

顯然,沒(méi)有。

這是選項(xiàng):

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)題”與isas你的問(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;}


查看完整回答
反對(duì) 回復(fù) 2019-08-24
?
慕容3067478

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())


查看完整回答
反對(duì) 回復(fù) 2019-08-24
  • 3 回答
  • 0 關(guān)注
  • 584 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)