通过反射将N包裹在Nullable <t>中</t>

时间:2013-07-23 11:26:51

标签: c# .net asp.net-mvc model-binding system.reflection

所以我有一个自定义通用模型绑定器,它同时处理T和Nullable&lt; T&gt; 但我通过反射自动创建bindigs。我搜索整个appdomain以查找标记有特定属性的枚举,并且我想绑定这样的theese枚举:

  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&lt; T&gt;到CommandModelBinder 我正在考虑运行时代码的生成,但我从来没有这样做,也许市场上还有其他选择。 有没有想过要实现这个目标?

谢谢,
彼得

1 个答案:

答案 0 :(得分: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将抛出异常。我没有添加错误检查,因为您已经过滤到只获取有意义的类型。如果您更改过滤,请记住这一点。