5

したがって、T と Nullable<T> の両方を処理するカスタム ジェネリック モデル バインダーがあります。
しかし、リフレクションを介してバインディングを自動的に作成します。特定の属性でフラグが立てられた列挙をアプリドメイン全体で検索し、これらの列挙を次のようにバインドしたいと考えています。

  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 にバインドできません。
ランタイム コードの生成を考えていますが、これを行うことはありません。市場には他のオプションがあるかもしれません。これを達成するためのアイデアはありますか?

ありがとう、
ピーター

4

1 に答える 1

8

を持っている場合は、次を使用してT作成できます。Nullable<T>Type.MakeGenericType

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間違った型で呼び出された場合、例外がスローされます。エラー チェックは追加していません。これが意味のある型だけを取得するために既にフィルター処理を行っているからです。ただし、フィルタリングを変更する場合は、このことに注意してください。

于 2013-07-23T12:03:27.767 に答える