2013-07-23 9 views
5

So habe ich eine benutzerdefinierte generische Modellbinder, die sowohl T und Nullable <T> behandeln.
Aber ich erstelle die Bindigs automatisch über Reflektion. Ich suche trhough die gesamte Appdomain für Aufzählung mit bestimmten Attribut markiert, und ich möchte binden theese Aufzählungen wie folgt aus:Wrap T in Nullable <T> über Reflexion

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

Aber hier ist der Haken. Ich kann die Nullable <T> nicht an CommandModelBinder binden.
Ich denke, die Laufzeit-Code-Generation, aber ich mache das nie, und vielleicht gibt es andere Optionen auf dem Markt. Irgendeine Idee, dies zu erreichen?

Danke,
Péter

Antwort

8

Wenn Sie T haben, können Sie Nullable<T>Type.MakeGenericType mit erstellen:

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

Ich weiß nicht, wie Sie Ihre CommandModelBinder funktioniert und was der entsprechende Konstruktor Argument möglicherweise benötigen Sie

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

statt.

Hinweis: MakeGenericType wird eine Ausnahme auslösen, wenn sie mit dem falschen Typ aufgerufen wird. Ich habe keine Fehlerprüfung hinzugefügt, da Sie bereits filtern, um nur die Typen zu erhalten, für die das Sinn macht. Denken Sie daran, wenn Sie Ihre Filterung jedoch ändern.

+0

Danke für die Antwort und den Tipp über die Filterung. Ich gehe davon aus, dass es sich so verhält, wie ich es codiert habe. Wenn es eine Einschränkung gibt oder wenn wir nicht die richtige Anzahl generischer Parameter übergeben, wird eine Ausnahme ausgelöst. –