各种类型的集合
本文关键字:集合 类型 种类 | 更新日期: 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);
}
}