Створення загального екземпляра типу <T> зі змінною, що містить тип


85

Чи можна досягти наступного коду? Я знаю, що це не працює, але мені цікаво, чи є обхідне рішення?

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

Трохи заплутаний вашим коментарем "це можна зробити в C # 4.0". Це не може, принаймні не так, як ви це показуєте. C # 4 все ще вимагає вказувати параметри загального типу під час компіляції; ви все ще не можете передавати змінну Type як загальний параметр типу.
itowlson

1
Будь ласка, сформулюйте речі як запитання, коли це питання. Код, як зазначено, не може бути виконаний за допомогою C # 4.0.
Лассе В. Карлсен,

1
Подібне запитання: stackoverflow.com/questions/687363/…
Zach Johnson

Вибачте про річ 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.