C# EF:如何反序列化从抽象类继承的对象?
是否可以反序列化从抽象类继承的对象 我有以下资料:C# EF:如何反序列化从抽象类继承的对象?,c#,entity-framework,asp.net-web-api2,abstract-class,C#,Entity Framework,Asp.net Web Api2,Abstract Class,是否可以反序列化从抽象类继承的对象 我有以下资料: public abstract partial class Item { public Item() { } public int ItemID { get; set; } public Nullable<int> ObjectStateID { get; set; } } public abstract partial class Appointment : Item { public Appointment(
public abstract partial class Item
{
public Item() { }
public int ItemID { get; set; }
public Nullable<int> ObjectStateID { get; set; }
}
public abstract partial class Appointment : Item
{
public Appointment() { }
public string AppointmentDescription { get; set; }
}
public partial class AppointedActivity : Appointment
{
public Nullable<int> AppointedActivityID { get; set; }
}
public partial class AppointedDevice : Appointment
{
public Nullable<int> AppointedDeviceID { get; set; }
}
我遇到的问题是,无论我身体的内容是什么,控制器中的项总是空的
发送到控制器的JSON示例:
{
"ObjectStateID": 1,
"AppointmentDescription": "test",
"AppointedActivityID": 90902 // Valid Activity ID.
}
我使用的是实体框架,我不确定代码有什么问题
谢谢 不能使用默认模型绑定器将抽象类型作为参数传递给控制器。因为模型绑定器在创建此参数的实例时会出错 如果要为此类型创建自己的自定义模型绑定器
public class ItemModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var values = (ValueProviderCollection) bindingContext.ValueProvider;
var itemId = (int) values.GetValue("ItemId").ConvertTo(typeof (int));
var objectStateId = (int?) values.GetValue("ObjectStateId").ConvertTo(typeof(int));
//Make desicion and create the real type instance Appointment, AppointedActivity or AppointedDevice
return (Item) new Appointment { ItemId= itemId, ObjectStateId = objectStateId };
}
}
在Global.asax中
ModelBinders.Binders.Add(new KeyValuePair<Type, IModelBinder>(typeof(Item), new ItemModelBinder()));
最后,我基于和创建了一个使用ItemResolver的自定义合同解析器:
JSON需要指定派生类型是什么,否则反序列化程序无法确定如何处理它。我将如何指定它?难道添加AppointDactivityId不足以派生出它是什么类型吗?谢谢你的帮助!如果有两个不同的派生类定义了一个名为AppointedActivityID的属性,该怎么办?看看这个,我相信活页夹无法确定要创建什么项目,所以我想您可以创建一个操作过滤器来构建并在项目参数中放入正确的对象。谢谢!我来试试
ModelBinders.Binders.Add(new KeyValuePair<Type, IModelBinder>(typeof(Item), new ItemModelBinder()));
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject item = JObject.Load(reader);
switch ((ResourceKind)item["ResourceKind"].Value<int>())
{
case ResourceKind.ACTIVITY:
return item.ToObject<AppointedActivity>();
case ResourceKind.CONSUMABLE:
return item.ToObject<AppointedConsumable>();
case ResourceKind.DEVICE:
return item.ToObject<AppointedDevice>();
default:
throw new Exception("Invalid ResourceType");
}
}