2011-04-15 103 views
1

在我正在工作的当前系统中,我需要具有修正功能。各种类型的集合

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

我想要一个“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包含各种类型的不同Ammentments的数量。我正在考虑使用ICollection,但是我会有一个ICollection<Ammenndment<T>>,我只能在包中使用一种类型的修正。

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

干杯

+1

如果我写'yourCollection [4] .AmmendedElement.Something',你会发生什么?那是什么类型? – SLaks 2011-04-15 00:07:40

+0

所有的修正都有一个共同的基类或接口吗?否则,你的确在看一个'List '和大量的手动管道。 – 2011-04-15 00:25:42

+0

您可能需要拼写修正。 – TrueWill 2011-04-15 01:12:08

回答

2

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

相反,您应该制作一个非泛型的基类或接口并将它们集合起来。

0

您可以创建实现相同接口的不同具体类型的集合。如果你使接口定义为空,那么它甚至可以应用于任何引用类型而无需修改该类型(但是你必须在运行时找出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); 
    } 
}