2013-07-23 18 views
5

Mam więc niestandardowy ogólny model spoiwa, który obsługuje zarówno T jak i Nullable <T>.
Ale automatycznie utworzę wiązania przez odbicie. Szukam trhough całej AppDomain dla wyliczenia chorągiewki z konkretnego atrybutu i chcę wiązać theese stałe teksty tak:Wrap T in Nullable <T> przez Refleksja

AppDomain 
    .CurrentDomain 
    .GetAssemblies() 
    .SelectMany(asm => asm.GetTypes()) 
    .Where(
     t => 
     t.IsEnum && 
     t.IsDefined(commandAttributeType, true) && 
     !ModelBinders.Binders.ContainsKey(t)) 
    .ToList() 
    .ForEach(t => 
    { 
     ModelBinders.Binders.Add(t, new CommandModelBinder(t)); 
     //the nullable version should go here 
    }); 

Ale tu jest haczyk. Nie mogę powiązać Nullable <T> z CommandModelBinder.
Myślę, że generowanie kodu runtime, ale nigdy tego nie robię, i być może są inne opcje na rynku. Każdy pomysł, aby to osiągnąć?

Dzięki,
Péter

Odpowiedz

8

Jeśli masz T można tworzyć Nullable<T> użyciu Type.MakeGenericType:

ModelBinders.Binders.Add(t, new CommandModelBinder(t)); 
var n = typeof(Nullable<>).MakeGenericType(t); 
ModelBinders.Binders.Add(n, new CommandModelBinder(n)); 

Nie wiem, w jaki sposób działa i co CommandModelBinder odpowiednim argumentem konstruktora jest , zamiast tego może być konieczne użycie tej metody.

Uwaga: MakeGenericType wygeneruje wyjątek, jeśli zostanie wywołany z nieprawidłowym typem. Nie dodałem do sprawdzania błędów, ponieważ już filtrujesz, aby uzyskać tylko typy, dla których ma to sens. Miej to na uwadze, jeśli zmienisz filtrowanie.

+0

Dzięki za odpowiedź i wskazówkę na temat filtrowania. Zakładam, że zachowuje się tak, jak je zakodowałem, więc jeśli istnieje ograniczenie lub jeśli nie przekazujemy poprawnego nmber parametrów ogólnych, wygeneruje on wyjątek. –