Коллекция различных типов - PullRequest
1 голос
/ 15 апреля 2011

В текущей системе, над которой я работаю, мне нужны функциональные возможности для внесения изменений.

То, что пользователь может создать пакет поправок, и этот пакет содержит новую версию различных объектов домена (не изменения структуры, а только изменения данных).

Я хочу иметь «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, содержащий несколько разных типов Ammentment. Я думал об использовании ICollection, но тогда у меня был бы ICollection<Ammenndment<T>>, и у меня мог быть только один тип поправок в пакете.

Также рассматривал вопрос об использовании словаря, но не уверен на 100%, как мне это сделать, но надеюсь, я не пропустил что-то действительно простое, но был бы рад некоторым идеям.

Приветствия

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011

Это невозможно.
Вы не можете иметь строго типизированную коллекцию, содержащую различные типы объектов.

Вместо этого вы должны создать неуниверсальный базовый класс или интерфейс и создать коллекциюте.

0 голосов
/ 23 апреля 2016

Вы можете создать коллекцию разных конкретных типов, которые реализуют один и тот же интерфейс.Если вы сделаете определение интерфейса пустым, его можно будет применить к любому ссылочному типу без изменения этого типа (но вам придется выяснить, какие операции доступны на 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...