2013-07-23 7 views
5

したがって、私はTとNullableの両方を扱うカスタム汎用バインダーを持っています<T>。
しかし、私はリフレクションによって自動的にbindigを作成します。私は、特定の属性でフラグが付けられた列挙のための全体のAppDomain trhough検索し、私はこのような列挙型をtheeseバインドしたい:Nullableで折り返しT <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 
    }); 

をしかし、ここでキャッチです。 Nullable <T>をCommandModelBinderにバインドすることはできません。
私はランタイムコードの生成を考えていますが、決してこれを行うことはありません。おそらく市場には他のオプションがあります。 これを達成するためのアイデアはありますか?

おかげで、
ペーテル

答えて

8

あなたはTを持っていれば、あなたはType.MakeGenericTypeを使用してNullable<T>を作成することができます。

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

私はどのようにあなたのCommandModelBinder作品とどのような適切なコンストラクタの引数があるのか​​わかりません代わりに、

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

が必要な場合があります。

注:間違ったタイプで呼び出された場合、MakeGenericTypeは例外をスローします。私はエラーチェックを追加していません、あなたはすでにこれが意味をなさない型を取得するためにフィルタリングしているからです。フィルタリングを変更した場合は、これを覚えておいてください。

+0

回答ありがとうございました。私はそれがコード化されているように動作すると想定しているので、制限がある場合や、適切な数の汎用パラメータを渡さないと例外がスローされます。 –

関連する問題