为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信