各种类型的集合

时间:2011-04-15 00:04:32

标签: c# collections models

在我正在研究的当前系统中,我需要具备修改功能。

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

我希望有一个“修改包”,其中包含对各种不同类型元素所做的所有修正。

到目前为止我已经

 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包含多种不同类型的Ammentment。我正在考虑使用ICollection,但后来我会有一个ICollection<Ammenndment<T>>,我只能在包装中有一种类型的修正。

还在考虑使用字典,但不是100%肯定我会如何工作,希望我没有错过一些非常基本的东西,但会欣赏一些想法。

干杯

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

您可以创建实现相同界面的不同具体类型的集合。如果将接口定义设置为空,那么它甚至可以应用于任何引用类型而无需修改该类型(但是您必须在运行时确定AmmendedElement上可用的操作 - 我不要&# 39;推荐这个,这是可能的)。例如:

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);
    }
}