C# 包含继承类的基类数组,访问非继承字段

我有一个抽象类 Detail,以及扩展 Detail 的四个类 Rock、Grass、Tree 和 Bush。

Tree 和 Bush 有 Fruit 属性,但其他没有

我有一个 Detail[] 包含所有 4 种类型的细节,并且给定一个索引,我需要找到该细节的果实(如果有的话)。

我不想将 Fruit 属性放在基类 Detail 中,因为并非所有细节都有水果,而且不同种类的细节具有完全不同的属性。

我怎样才能得到例如 Detail[17] 的果实,而不知道它是什么类型的细节,或者它是否有果实(如果没有,可能返回 null)?请记住,可能会有数百种不同类型的细节具有数十种可能的属性。

我正在想象某种标记系统,其中数组中的每个项目可能有也可能没有几个标签中的一个,但这是我迄今为止管理的最接近的一个。


呼唤远方
浏览 143回答 2
2回答

守着星空守着你

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.}

绝地无双

您也可以为提供水果的类提供 IHasFruit 接口,然后您可以通过您的接口循环。IHasFruit [] myArray或者如果您需要使用Detail[] myArrayforeach (var item in myArray){&nbsp; &nbsp; &nbsp;If (item&nbsp; is IHasFruit hasFruit)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//do whatever}或反射(较慢)Detail[] myArrayforeach (var item in myArray){&nbsp; &nbsp; &nbsp;var hasFruit= item.GetType().GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IHasFruit<>));}或者,如果您不想以任何方式使用界面。您可以使用İtem.GetType().GetProperty("propertyName") ...
打开App,查看更多内容
随时随地看视频慕课网APP