С#: Создание списков общих контейнеров?

61
6

У меня есть ситуация, когда у меня есть контейнер данных, который выглядит примерно так:

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 и дегенерировать его?

Спасибо!

спросил(а) 2021-01-27T23:54:13+03:00 4 недели, 1 день назад
1
Решение
86

Вы можете сделать что-то вроде этого:

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

ответил(а) 2021-01-27T23:54:13+03:00 4 недели, 1 день назад
43

Вы можете создать нестандартную базовую версию DataContainer и использовать ее для своего общего типа List

ответил(а) 2021-01-27T23:54:13+03:00 4 недели, 1 день назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема