リフレクションを使用して、BindingContext から取得した指定された型のオブジェクトにプロパティを割り当てる汎用モデル バインダーを構築しようとしています。だから、このようなもの:
public class ModelBinder : IModelBinder
{
public object BindModel<T, K> (ControllerContext controllerContext, ModelBindingContext bindingContext)
where T : class, new()
where K : class
{
Type ObjectType = typeof(T);
Type InterfaceType = typeof(K);
T obj = new T();
foreach (var Property in ObjectType.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance))
{
Type PropertyType = Property.PropertyType;
// checks if property is a custom data object
if (!(PropertyType.GetGenericArguments().Count() > 0 && PropertyType.GetGenericArguments()[0].GetInterfaces().Contains(InterfaceType)))
{
Property.SetValue(obj, bindingContext.ValueProvider.GetValue(Property.Name), null);
}
}
return obj;
}
IModelBinder インターフェイスを正しく実装していないため、明らかにこれは機能しません。このようなことは可能ですか?
編集:
私がこれを行っている理由をさらに詳しく説明すると、私たちのオブジェクトはさまざまなカスタム オブジェクトを使用しています。たとえば、 Class オブジェクト:
public class Class : ModelBase<Class>
{
public Class () { }
public virtual string ClassDescription { get; set; }
public virtual string ClassName { get; set; }
public virtual LookUp ClassType { get; set; }
public virtual double Credits { get; set; }
public virtual bool Documents { get; set; }
public virtual LookUp PracticeArea { get; set; }
}
LookUp クラスを使用します。
public class LookUp : ModelBase<LookUp>
{
public LookUp () { }
public virtual string DisplayName { get; set; }
public virtual LookUpType Type { get; set; }
}
ドロップダウンはルックアップやその他のオブジェクトに使用されるため、クラス/作成用のカスタム モデル バインダーは次のようになります。
LookUp ClassType = LookUp.Load(long.Parse(bindingContext.ValueProvider.GetValue("ClassType").AttemptedValue))
DefaultModelBinder を使用してこのような処理を行う方法がわかりません。