Создание экземпляра типа Generic <T> с переменной, содержащей Type


85

Можно ли получить следующий код? Я знаю, что это не работает, но мне интересно, есть ли обходной путь?

Type k = typeof(double);
List<k> lst = new List<k>();

Немного смущен вашим комментарием «это можно сделать в C # 4.0». Не может, по крайней мере, так, как вы это показываете. C # 4 по-прежнему требует указания параметров универсального типа во время компиляции; вы по-прежнему не можете передать переменную типа в качестве параметра универсального типа.
itowlson

1
Пожалуйста, формулируйте вещи как вопрос, когда это вопрос. Указанный код не может быть выполнен с помощью C # 4.0.
Лассе В. Карлсен

1
Аналогичный вопрос: stackoverflow.com/questions/687363/…
Зак Джонсон,

Извините по поводу C # 4.0. Я имел в виду, что в ответе могут использоваться концепции C # 4.0, не обязательно, что код будет работать в C # 4.0. Спасибо за редактирование DrJokepu.
Крис

12
Я думаю, что этот вопрос сформулирован идеально - точное количество деталей!
RunHolt

Ответы:


119

Да, есть:

var genericListType = typeof(List<>);
var specificListType = genericListType.MakeGenericType(typeof(double));
var list = Activator.CreateInstance(specificListType);

Я думаю, это то, что я хочу. Позвольте мне еще раз проверить, и я на мгновение отмечу ваш как ответ.
Крис

3
Я думаю , что главная проблема здесь состоит в том , что вы не описать то , что вы хотите нам . Вы показываете нам неудачную попытку чего-то, а затем спрашиваете, как добиться того, чего вы хотите . Если вам нужны ответы, а не догадки, вы должны описать, что вам нужно сделать, а не то, как вы пытались это сделать.
Лассе В. Карлсен

Я в основном хочу создать List <>, где тип указан как переменная Type.
Крис

3
Спасибо, Дэвид М., ваш код делает именно то, что мне нужно. Извините тех, кто не смог ответить, потому что я не задал адекватного вопроса.
Крис

можно ли сделать то же самое для универсальных методов? Мне нужно передать динамический тип для метода, я разместил свою проблему по ссылке ниже stackoverflow.com/questions/4101784/…
Mathiyazhagan

3

Более чистый способ - использовать общий метод. Сделайте что-нибудь вроде этого:

static void AddType<T>()
    where T : DataObject
{
    Indexes.Add(typeof(T), new Dictionary<int, T>());
}

Я не уверен, что вы имеете в виду под «индексами», это переменная, объявленная где-то еще?
jrh
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.