Немного смущен вашим комментарием «это можно сделать в C # 4.0». Не может, по крайней мере, так, как вы это показываете. C # 4 по-прежнему требует указания параметров универсального типа во время компиляции; вы по-прежнему не можете передать переменную типа в качестве параметра универсального типа.
itowlson
1
Пожалуйста, формулируйте вещи как вопрос, когда это вопрос. Указанный код не может быть выполнен с помощью C # 4.0.
Извините по поводу 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
Более чистый способ - использовать общий метод. Сделайте что-нибудь вроде этого:
staticvoidAddType<T>()
where T : DataObject
{
Indexes.Add(typeof(T), new Dictionary<int, T>());
}
Ответы:
Да, есть:
var genericListType = typeof(List<>); var specificListType = genericListType.MakeGenericType(typeof(double)); var list = Activator.CreateInstance(specificListType);
источник
Более чистый способ - использовать общий метод. Сделайте что-нибудь вроде этого:
static void AddType<T>() where T : DataObject { Indexes.Add(typeof(T), new Dictionary<int, T>()); }
источник