Передача типа в общий метод во время выполнения
У меня есть что-то вроде этого
Type MyType = Type.GetType(FromSomewhereElse);
var listS = context.GetList<MyType>().ToList();
Я хотел бы получить Type, который является MyType в этом случае, и передать его методу Generic Type GetList
Это ошибка, которую я получаю:
Невозможно найти имя типа или пространства имен 'MyType' (вам не хватает директивы using или ссылки на сборку?)
Ответы
Ответ 1
Вы можете использовать отражение и построить свой вызов следующим образом:
Type MyType = Type.GetType(FromSomewhereElse);
var typeOfContext = context.GetType();
var method = typeOfContext.GetMethod("GetList");
var genericMethod = method.MakeGenericMethod(MyType);
genericMethod.Invoke(context, null);
Обратите внимание, что вызов методов с отражением приведет к огромному снижению производительности, попробуйте перепроектировать решение, если это возможно.
Ответ 2
Вам нужно будет использовать отражение:
var method = context.GetType()
.GetMethod("GetList").MakeGenericMethod(MyType)
IEnumerable result = (IEnumerable)method.Invoke(context, new object[0]);
List<object> listS = result.Cast<object>().ToList();
Однако нет возможности использовать ваш экземпляр типа MyType
как переменную статического типа, поэтому лучше всего набирать результаты как object
.
Ответ 3
Динамически не генерируйте generics, используя тип. Дженерики заполняются именем класса, а не типом.
Вы можете использовать Activator.CreateInstance для создания родового типа. Вам придется динамически создавать общий тип.
Чтобы создать динамический тип общего типа.
Type listFactoryType = typeof(GenericListFactory<>).MakeGenericType(elementType);
var dynamicGeneric = (IListFactory)Activator.CreateInstance(listFactoryType);
Вместо получения списка с помощью универсального метода вы можете создать общий класс, который предоставляет этот метод. Вы можете получить такой интерфейс.
interface IListFactory
{
IList GetList();
}
class GenericListFactory<T>
{
public IList GetList() { return new List<T>(); }
}