2009-09-03 2 views
14

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

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

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

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

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

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

+14

Я чувствую себя грязным, просто читая ваш образец кода. –

ответ

34

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

+0

Может быть хорошей идеей добавить объяснение открытых/закрытых общих типов для полноты. –

+0

MakeGenericType был именно тем, что я искал. Благодаря! :) Ответ принят – 2009-09-03 07:18:08

Смежные вопросы