С#: Создание списков общих контейнеров?
У меня есть ситуация, когда у меня есть контейнер данных, который выглядит примерно так:
public class DataContainer<T>
{
public T GetData { get; private set; }
public DataContainer(T data)
{
this.GetData = data;
}
}
Но, к сожалению, мне нужно иметь список этих контейнеров, где общий параметр каждого из них неизвестен до времени исполнения и может варьироваться от элемента к элементу. Сначала я попытался запустить что-то вроде:
IList<DataContainer<dynamic>> containerList = new List<DataContainer<dynamic>>();
containerList.add((dynamic)new DataContainer<int>(4));
containerList.add((dynamic)new DataContainer<string>("test"));
Что, к сожалению, не работает (запускается в RuntimeBinderException). Сначала я попытался выполнить кастинг (DataContainer), но я получил там InvalidCastException.
Мой вопрос состоит из двух частей:
Я понимаю, что я, вероятно, злоупотребляю "динамическими", чтобы попытаться получить поведение, которое я хочу, но может ли кто-нибудь объяснить, почему вышеуказанное не будет работать?
Какой лучший способ подойти к этой ситуации? Должен ли я подталкивать динамик в "GetData" для DataContainer и дегенерировать его?
Спасибо!
Вы можете сделать что-то вроде этого:
public interface IDataContainer
{
object GetData{get;set;}
}
public class DataContainer<T> : IDataContainer
{
public T GetData { get; private set; }
object IDataContainer.GetData
{
get { return this.GetData; }
set { this.GetData = (T)value; }
}
public DataContainer(T data)
{
this.GetData = data;
}
}
Тогда вы можете сделать:
IList<IDataContainer> containerList = new List<IDataContainer>();
containerList.Add(new DataContainer<string>("test"));
containerList.Add(new DataContainer<int>(234));
Вы можете создать нестандартную базовую версию DataContainer и использовать ее для своего общего типа List