亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C# 包含繼承類的基類數組,訪問非繼承字段

C# 包含繼承類的基類數組,訪問非繼承字段

C#
呼喚遠方 2022-06-12 15:02:07
我有一個抽象類 Detail,以及擴展 Detail 的四個類 Rock、Grass、Tree 和 Bush。Tree 和 Bush 有 Fruit 屬性,但其他沒有我有一個 Detail[] 包含所有 4 種類型的細節,并且給定一個索引,我需要找到該細節的果實(如果有的話)。我不想將 Fruit 屬性放在基類 Detail 中,因為并非所有細節都有水果,而且不同種類的細節具有完全不同的屬性。我怎樣才能得到例如 Detail[17] 的果實,而不知道它是什么類型的細節,或者它是否有果實(如果沒有,可能返回 null)?請記住,可能會有數百種不同類型的細節具有數十種可能的屬性。我正在想象某種標記系統,其中數組中的每個項目可能有也可能沒有幾個標簽中的一個,但這是我迄今為止管理的最接近的一個。
查看完整描述

2 回答

?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

MakeTree和Bush其他具有Fruit屬性 implement的子類,IHasFruit如下所示:


interface IHasFruit {

    // I assume "Fruit" properties are of type "Fruit"?

    // Change the type to whatever type you use

    Fruit Fruit { get; }

}


class Tree : Detail, IHasFruit {

    ...

}


class Bush : Detail, IHasFruit {

    ...

}

現在,您可以編寫一個GetFruit方法:


public Fruit GetFruit(int index) {

    Detail detail = details[index];

    return (detail as IHasFruit)?.Fruit; // this will return null if the detail has no fruit.

}


查看完整回答
反對 回復 2022-06-12
?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

您也可以為提供水果的類提供 IHasFruit 接口,然后您可以通過您的接口循環。


IHasFruit [] myArray

或者如果您需要使用


Detail[] myArray

foreach (var item in myArray)

{

     If (item  is IHasFruit hasFruit)

         //do whatever

}

或反射(較慢)


Detail[] myArray

foreach (var item in myArray)

{

     var hasFruit= item.GetType().GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IHasFruit<>));

}

或者,如果您不想以任何方式使用界面。您可以使用


?tem.GetType().GetProperty("propertyName") ...


查看完整回答
反對 回復 2022-06-12
  • 2 回答
  • 0 關注
  • 165 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號