各种类型的集合

本文关键字:集合 类型 种类 | 更新日期: 2023-09-27 17:50:10

在我目前正在开发的系统中,我需要具有修改功能。

用户可以创建一个修改包,该包包含各种域对象的新版本(不是结构更改,只是数据更改)。

我想要有一个"AmmendmentPackage",它包含了对各种不同类型的元素所做的所有修改。

目前我有

 public class AmmendmentPackage : BaseObject
 {
    public string Name {get;set;}
    public string Description { get; set; }
    public int MajorVersionNumber { get; set; }
    public int MinorVersionNumber { get; set; }
    public bool IsGazetted { get; set; }
    public AmmendmentPackageState State { get; set; }
}
public class Ammendment<T>
{
    public T AmmendedElement{get;set;}
    public AmmendmentState State {get;set;}
    public ConcurrencyDetails ConcurrencyState { get; set; }
}

如何让AmmendmentPackage包含许多不同类型的不同修正案?我在考虑使用ICollection,但是我将有一个ICollection<Ammenndment<T>>,我只能在包中有一种类型的修正。

也在考虑使用字典,但不是100%确定我将如何工作,希望我没有错过一些真正基本的东西,但会感谢一些想法。

欢呼

各种类型的集合

这是不可能的。您不能拥有包含不同类型对象的强类型集合。

相反,您应该创建一个非泛型基类或接口,并创建它们的集合。

您可以创建实现相同接口的不同具体类型的集合。如果您使接口定义为空,那么它甚至可以应用于任何引用类型而无需修改该类型(但是您必须在运行时找出AmmendedElement上可用的操作—我不建议这样做,这是可能的)。例如:

using System;
using System.Collections.Generic;
public interface IAnyType { }
public abstract class PackageBase { }
public class Class_1 : IAnyType { public string Class_1_String { get; set; } }
public class Class_2 : IAnyType { public string Class_2_String { get; set; } }
public class AmmendmentPackage : PackageBase
{
    public IList<Ammendment<IAnyType>> Ammendments { get; set; }
}
public class Ammendment<T> where T : IAnyType
{
    public T AmmendedElement { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        Ammendment<IAnyType> ammendment_1 = new Ammendment<IAnyType>();
        ammendment_1.AmmendedElement = new Class_1();
        Ammendment<IAnyType> ammendment_2 = new Ammendment<IAnyType>();
        ammendment_2.AmmendedElement = new Class_2();
        AmmendmentPackage package = new AmmendmentPackage();
        package.Ammendments = new List<Ammendment<IAnyType>>(2);
        package.Ammendments.Add(ammendment_1);
        package.Ammendments.Add(ammendment_2);
    }
}