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