Вопрос по c#, reflection, generic-list – Общий список с использованием отражения

4

У меня есть сценарий, по которому я получилClass name as a string Я просто хочу создать общийList этого класса. Я попробовал следующее

            Type _type = Type.GetType(className);

            List<_type> list = new List<_type>();

Но я получаюerror, Я не могу указать этот тип в качестве аргумента списка. Если кто-нибудь знает, пожалуйста, помогите мне

Я добавлю еще один гранд. Cole Johnson
Но я просто хочу обобщить сценарий ... На самом деле мне нужно вернуть общий список из самого DataAccess. тоже хочу обобщить метод .. Nithesh
Это похоже на потенциально плохую модель. Можете ли вы предоставить более подробную информацию о том, что это должно решить? Почему имя вашего класса появляется в строке? Это часть какого-то кастомного сериализатора? JamieSee
Тогда вам не нужны генерики, но вы можете использовать неуниверсальный список. Euphoric
Почему ты бы так поступил? Бьюсь об заклад, 1000 долларов, что вы пытаетесь сделать что-то глупое и приведет к плохому дизайну. Euphoric

Ваш Ответ

4   ответа
11

Ближайшие вы можете получить:

Type listType = typeof(List<>).MakeGenericType(_type);
IList list = (IList) Activator.CreateInstance(listType);
Пока_type ссылается на это.
Возможно ли, если класс _type находится в другой библиотеке классов? Nithesh
0

К сожалению, это невозможно, так как обобщения должны быть известны во время компиляции. Вы пытаетесь переопределить это, делая их известными во время выполнения. Причина, по которой они должны быть известны во время компиляции, заключается в том, что компилятор может проверить, что все переданные ему переменные являются действительными. AFAIK, выполнение того, что ты хочешь сделать, потребует полного переписывания дженериков.

Основная причина проверки времени компиляции заключается в том, что_type может измениться во время выполнения, и тогда будет добавление вList<T> так как JIT-компилятор должен будет выполнить проверку типов.

То, что сказал @MarkusJarderot, является наиболее близким, поскольку вы можете использовать интерфейсы вместо универсальных.

1

Если вы используете .Net 4, то с помощьюdynamic может помочь В этом случае вы сможете использовать методы экземпляра, которые не доступны через неуниверсальные интерфейсы (такие какIList).

Например, используяdynamic позволяет вам вызыватьAddRanges метод списка, который вы не могли бы сделать через приведение кIList:

Type _type = typeof(int);
Type listType = typeof(List<>).MakeGenericType(_type); 
dynamic list = Activator.CreateInstance(listType); 

list.Add(1);   
list.AddRange(new int[] {0, 1, 2, 3});  

Однако этот метод не так безопасен для типов, как приведение к неуниверсальному интерфейсу, поскольку он не может перехватывать ошибки во время компиляции.

2

Отражение происходит во время выполнения, так как тип работающего объекта может быть изменен на что угодно.

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

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

Похожие вопросы