Ответ 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
все ограничения общего типа по-прежнему применяются, но просто во время выполнения, а не во время компиляции.