2011-04-15 7 views
1

Dans le système actuel sur lequel je travaille, j'ai besoin de fonctionnalités pour les amendements. Cela signifie qu'un utilisateur peut créer un paquet de modification et que ce paquet contient une nouvelle version de divers objets de domaine (la structure ne change pas seulement les données modifiées).Collection de différents types

Je veux avoir un "AmmendmentPackage" qui contient tous les amendements qui doivent être apportés à différents types d'éléments.

Jusqu'à présent, j'ai

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

Comment puis-je d'avoir la AmmendmentPackage contiens de différentes Ammentments de différents types. Je pensais utiliser ICollection mais j'aurais un ICollection<Ammenndment<T>> et je pourrais seulement avoir un type d'amendement dans le paquet.

Également envisageait d'utiliser un dictionnaire, mais pas sûr à 100% comment je travaillerais dans ce moment, j'espère que je n'ai pas manqué quelque chose de vraiment basique mais j'apprécierais quelques idées.

Vive

+1

Que voulez-vous que se produise si j'écris 'yourCollection [4] .AmmendedElement.Something'? Quel type serait-ce? – SLaks

+0

Est-ce que tous les amendements peuvent avoir une classe de base ou une interface commune? Sinon, vous êtes en train de regarder une liste et beaucoup de plomberie manuelle. –

+0

Vous voudrez peut-être l'épeler Modifications. – TrueWill

Répondre

2

Ce n'est pas possible.
Vous ne pouvez pas avoir une collection fortement typée qui contient différents types d'objets. A la place, vous devriez créer une classe de base ou une interface non générique et en faire une collection.

0

Vous pouvez créer une collection de différents types de béton qui implémentent la même interface. Si vous définissez la définition d'interface vide, elle peut même être appliquée à n'importe quel type de référence sans modifier ce type (mais vous devrez déterminer quelles opérations sont disponibles sur un AmmendedElement lors de l'exécution - Je ne le recommande pas, il est juste possible). Par exemple:

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