Коллекция различных типов

#c# #collections #models

#c# #Коллекции #Модели

Вопрос:

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

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

Я хочу иметь «Пакет исправлений», который содержит все исправления, которые должны быть внесены в различные типы элементов.

Пока у меня есть

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

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

Приветствия

Комментарии:

1. Что бы вы хотели, чтобы произошло, если я напишу yourCollection[4].AmmendedElement.Something ? Какой бы это был тип?

2. Могут ли все исправления иметь общий базовый класс или интерфейс? В противном случае вы действительно смотрите на List<object> и множество ручных настроек.

3. Возможно, вы захотите написать это с поправками.

Ответ №1:

Это невозможно.
У вас не может быть строго типизированной коллекции, которая содержит объекты разных типов.

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

Ответ №2:

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