2011-04-15 105 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); 
    } 
}