2013-07-23 10 views
5

Quindi ho un modello di raccoglitore generico personalizzato, che gestisce sia T che Nullable <T>.
Ma automaticamente creo i collegamenti tramite la riflessione. Cerco trhough l'intero dominio applicazione per l'enumerazione contrassegnate con attributo specifico e voglio legare theese enumerazioni come questo:Wrap T in Nullable <T> via Reflection

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

Ma qui è la cattura. Non riesco a collegare il Nullable <T> a CommandModelBinder.
Sto pensando alla generazione del codice runtime, ma non lo faccio mai, e forse ci sono altre opzioni sul mercato. Qualche idea per raggiungere questo obiettivo?

Grazie,
Péter

risposta

8

Se hai T, è possibile creare Nullable<T> usando Type.MakeGenericType:

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

Non so come i vostri CommandModelBinder funziona e ciò che l'argomento del costruttore è appropriata , potrebbe essere necessario

ModelBinders.Binders.Add(n, new CommandModelBinder(t)); 

invece.

Nota: MakeGenericType genererà un'eccezione se chiamata con il tipo errato. Non ho aggiunto il controllo degli errori, dal momento che stai già filtrando per ottenere solo i tipi per i quali questo ha senso. Tieni questo a mente se cambi il filtro però.

+0

Grazie per la risposta e il suggerimento sul filtraggio. Presumo che si comporti come ho codificato, quindi se ci sono un restrizione o se non passiamo il corretto nmber dei parametri generici, genererà un'eccezione. –

Problemi correlati