C # - словарь с общим массивом в качестве значения - PullRequest
0 голосов
/ 10 января 2011

В моем классе я хочу использовать словарь со следующим объявлением:

Dictionary<string, T[]>

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

Одна альтернатива, которую я пытаюсь использовать, - использовать Dictionary<string, object> вместо:

public void Add<T>(string str, T value)
{
  // Assuming key already exists
  var array = (T[]) dictionary[str];
  array[0] = value;
}

Тем не менее, при переборе словаря, как преобразовать значение объекта обратно в массив?

foreach(string strKey in dictionary.Keys)
{
  var array = (T[]) dictionary[strKey];   // How to cast here ?
  //...
  array[0] = default(T);
}

Спасибо.

Ответы [ 3 ]

2 голосов
/ 10 января 2011

Вы не приводите к T[], вы используете System.Array, базовый класс для всех массивов.

var dictionary = new Dictionary<string, Array>();
foreach( var item in dictionary )
    item.Value.SetValue(null, 0);

Другие операции, которые вы можете выполнять без приведения к определенному типу массива: Array.Clear и Buffer.BlockCopy.

2 голосов
/ 10 января 2011

Поскольку операции моего класса точно так же для всех универсальных типов

Что вы можете сделать, это определить все методы, которые одинаковы в интерфейсе, и заставить ваши универсальные классы реализовать этот интерфейс. После того, как вы это сделаете, все, что вам нужно сделать, это создать словарь, который принимает строки как ключи и массивы типа InterfaceName. Это должно позволить вам иметь общие значения (вместо object), и вам также не нужно будет вводить cast.

1 голос
/ 10 января 2011

Вы должны использовать универсальный класс.Преимущество использования универсального класса, если объект, извлеченный из словаря, является типобезопасным и не требует приведения - это уже будет требуемый тип.

Вы говорите, что «операции моего классаточно так же для всех универсальных типов »- если это означает, что я думаю, это означает, что это просто усиливает полезность универсального класса в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...