在这种情况下我可以使用 C# 列表吗?

Can I use a C# List in this case?

我有一个相似类型的操作列表,我需要为其创建不同的 classes ActionClass1ActionClass2。 此外,我有不同的站点,我需要在这些站点上执行一系列不同的操作。请注意,此列表的内容将取决于站点。

我想开发一个 GUI 以便能够使用 c# 和 WPF 编辑在给定站点上执行的操作 SiteClass

我现在的想法是:

  1. Subclass 不同的动作 classes ActionClass1 等来自一个普通的抽象动作 class AbstractActionClass.
  2. 创建列表 ActionList of AbstractActionClass,其中将包含不同的操作作为具体实现(例如 ActionClass1 等)。
  3. 创建 SiteList SiteClass 实例的列表,其中将包含网站及其相应的操作列表和附加信息(例如网站位置等)。

到目前为止,我对上述内容有了一个很好的了解。但是,我现在需要能够为每个站点编辑 ActionList 并在 GUI 中对其进行样式设置,以便所有具有相同 ActionList 的站点看起来都相同(例如具有相同的颜色)。因此,我需要能够比较 SiteListSiteClass 的每个实例的 ActionList 以检查它们是否不同,找出有多少不同的实例,然后相应地设置它们的样式在 GUI 中。

所以我的问题是:我是否可以在 SiteClass 中使用 ActionList List<AbstractActionClass> 类型的列表来执行 'Unique' 等比较以找出数字SiteList List<SiteClass> 中唯一出现的 ActionList List<AbstractActionClass> 并将此信息用于样式?有没有更好的方法?

简答:是

详细解答。您可以创建一个 List<AbstractionClass> 并处理不同的渲染,您可以采用两种方法:

  1. 在 class 中添加摘要 属性,告诉您 class 是什么:

    public abstract string ClassType { get; }
    

并将其作为简单的

在每个不同的动作列表中实现
public override string ClassType { get { return "ActionClass1";}}

然后在你的渲染代码中做一些类似

的事情
switch (ac.ClassType)
{ 
    case "ActionClass1":
        /// render according to class 1;
        break;
    case "ActionClass2":
        /// render according to class 2;
        break;
  }
  1. 你可以做一些简单的转换:

    if (ac is ActionClass1)
    {
        /// render according to class 1
    }
    else if (ac is ActionClass2)
    {
       ///  render according to class 2
    }
    
  2. 您可以抽象列表本身:

    public class ActionClassList : List<ActionClass>
    {
        public abstract string ClassType { get;}
    }
    

并将 ActionClassList1 和 ActionClassList2 实施到 return 不同的类类型。

在接收端,您始终接受 ActionClassList,但它可以是您获得的派生 classes 之一。

是的。这可以在 C# 中以多种方式完成,但是 C# 列表对于这个来说并不是一个坏主意,因为你很熟悉并且可以更好地理解这个想法,所以我不会说使用 C# 列表有什么不妥。