Создание определения общего типа c # во время выполнения

В настоящее время мне нужно сделать что-то вроде этого, чтобы создать определение типа во время выполнения, чтобы передать его моему IOC для разрешения. Упрощенный:

Type t = Type.GetType(
"System.Collections.Generic.List`1[[ConsoleApplication2.Program+Person");

Я знаю аргумент универсального типа только во время выполнения.

Есть ли что-то, что позволит мне сделать что-то вроде этого (поддельный код):

Type t = Type.GetTypeWithGenericTypeArguments(
    typeof(List)
    , passInType.GetType());

Или я просто буду придерживаться своего хака, passInType.GetType() преобразовать в строку, построить строку универсального типа ... чувствовать себя грязно


person Community    schedule 03.09.2009    source источник
comment
Я чувствую себя грязным, просто читая ваш образец кода.   -  person Taylor Leese    schedule 03.09.2009


Ответы (1)


MakeGenericType - i.e.

Type passInType = ... /// perhaps myAssembly.GetType(
        "ConsoleApplication2.Program+Person")
Type t = typeof(List<>).MakeGenericType(passInType);

Для полного примера:

using System;
using System.Collections.Generic;
using System.Reflection;
namespace ConsoleApplication2 {
 class Program {
   class Person {}
   static void Main(){
       Assembly myAssembly = typeof(Program).Assembly;
       Type passInType = myAssembly.GetType(
           "ConsoleApplication2.Program+Person");
       Type t = typeof(List<>).MakeGenericType(passInType);
   }
 }
}

Как предлагается в комментариях - чтобы объяснить, List<> - это открытый общий тип, то есть «List<T> без какого-либо конкретного T» (для нескольких общих типов вы просто используете запятые, то есть Dictionary<,>). Когда указан T (либо через код, либо через MakeGenericType), мы получаем общий тип closed - например, List<int>.

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

person Marc Gravell    schedule 03.09.2009
comment
Было бы неплохо добавить объяснение открытых / закрытых универсальных типов для полноты. - person Arnis Lapsa; 03.09.2009
comment
MakeGenericType был именно тем, что я искал. Спасибо! :) Ответ принят - person ; 03.09.2009