Подтвердить что ты не робот

Сборка встроенного типа С# во время выполнения

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

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

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

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

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

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

4b9b3361

Ответ 1

MakeGenericType - т.е.

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), мы получаем закрытый общий тип - например, List<int>.

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