所以我有一个自定义通用模型绑定器,它同时处理T和Nullable< T> 但我通过反射自动创建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< T>到CommandModelBinder 我正在考虑运行时代码的生成,但我从来没有这样做,也许市场上还有其他选择。 有没有想过要实现这个目标?
谢谢,
彼得
答案 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
将抛出异常。我没有添加错误检查,因为您已经过滤到只获取有意义的类型。如果您更改过滤,请记住这一点。