2009-09-03 18 views
14

Obecnie muszę zrobić coś takiego, aby zbudować definicję typu w czasie wykonywania, aby przekazać do mojego IOC do rozwiązania. Uproszczony:Zbuduj C# Ogólne definicje typu w czasie wykonywania

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

Znam ogólny typ argument tylko w środowisku wykonawczym.

Czy istnieje coś, co pozwoli mi zrobić coś takiego (fałszywego kodu):

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

Albo będę po prostu trzymać się mojego siekać, passInType.GetType() konwersji do napisu, zbudować rodzajowe typu ciąg .. czuć brudne

+14

Czuję się brudno po prostu czytając próbkę kodu. –

Odpowiedz

34

MakeGenericType - tj

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

Pełną przykład:

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); 
    } 
} 
} 

Jak sugerowano w komentarzach - wyjaśnić, List<> jest otwarty generic type - czyli "List<T> bez szczególnego T" (dla wielu typów generycznych, wystarczy użyć przecinków - to znaczy Dictionary<,>). Po określeniu T (przez kod lub przez MakeGenericType) otrzymamy zamknięty typ ogólny - na przykład List<int>.

Podczas korzystania z MakeGenericType wszystkie ograniczenia typów ogólnych są nadal egzekwowane, ale po prostu w czasie wykonywania, a nie w czasie kompilacji.

+0

Może być dobrym pomysłem dodawanie wyjaśnień otwartych/zamkniętych rodzajów generycznych pod kątem kompletności. –

+0

MakeGenericType było dokładnie tym, czego szukałem. Dzięki! :) Odpowiedź zaakceptowana –

Powiązane problemy