gpt4 book ai didi

c# - 识别数组中基类的实现

转载 作者:太空狗 更新时间:2023-10-29 20:39:53 24 4
gpt4 key购买 nike

我有以下问题:我有一组自动(监听事件)控制我的模型的引擎。下图大致显示了类图: Class Diagramm

现在我有一个知道 EngineFacade 的客户端,我想从客户端设置 Engine2 的属性 Active,但是客户端和 EngineFacade 都不知道这三个引擎中的哪个是 Engine2。

有两种方法,但我都不喜欢:

  1. 检查其中一个引擎是否为 Engine2 类型 - 如果有另一个类执行相同的任务但名称不同,我必须在 EngineBuilder 和 EngineFacade 中更改它。
  2. 检查标识符字符串 - 我真的不喜欢魔术字符串。

我在客户站点上知道有或应该有一个处理网格的引擎。但我不知道更多。

也许我必须在两个魔鬼之间做出选择,但也许你们中的一个有更好的解决方案。

最佳答案

您可以在 Engine2 的实现上使用属性,如下所示:

[AttributeUsage(AttributeTargets.Class)]
public class HandlesGridAttribute : Attribute { }

然后将其应用于推导:

[HandlesGrid]
public Engine2 : EngineBase { ... }

然后,在您的客户端中,检查属性:

IEnumerable<EngineBase> bases = ...;

// Get all the implementations which handle the grid.
IEnumerable<EngineBase> handlesGrid = bases.
Where(b => b.GetType().
GetCustomAttributes(typeof(HandlesGridAttribute), true).Any());

// Set the active property.
foreach (EngineBase b in handlesGrid) b.Active = true;

这里的主要缺点(可能适用也可能不适用于您)是您不能在运行时更改值(因为该属性是在编译时嵌入的)。如果您的引擎不是动态的,那么属性是正确的方法。

如果您需要更改派生是否可以在运行时执行此操作,那么您必须退回到第二个选项,即识别引擎属性的代码构造。请注意,它不一定是字符串(我也不喜欢那样),但它可以是结构化程度更高的内容,可以为您提供所需的信息。

关于c# - 识别数组中基类的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15274262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com