我有2个模型对象:
public class Setting
{
public Guid Id { get; set; }
public bool Value { get; set; }
}
public class SettingItem : Setting
{
public string Description { get; set; }
}
当我从服务器上获取Get时,我得到了用于绑定到UI的SettingItem(带有描述)。在保存时,我想序列化设置(没有描述)返回服务器。为了实现这一点,我试图创建一个类型为Setting的新对象,并使用来自SettingItem的数据填充它,但我的新对象不是Setting类型,它是SettingItem:
IEnumerable<Setting> settings = new List<Setting>(_settingItems);
我唯一能做的就是这种转换,它违背了继承的意图:
var settings = _settingItems.Select(n => new NotificationSettingInput()
{
NotifyTypeId = n.NotifyTypeId,
IsOptedIn = n.IsOptedIn
});
答案 0 :(得分:1)
您无法永久地将派生类型转换为基类型 - 这完全是故意的,因为多态性和继承都是关于什么的。假设您有一个派生类,它具有重写方法或对您设置的参数强制执行某些条件。
如果您无法组合这些类并使用已建议的[NonSerialized]
,那么实现此目的的正确方法是初始化基类型并复制值,就像您一样。 (深层复制)我能想到的另一种方法是自定义序列化实现,或者之后修改序列化数据。
例如,在我公司内部,我们有一个序列化类,它采用以下内容:
var xml = _serializer.Serialize<Setting>(settingItem);
所以它只能将类序列化为Setting
类型。不确定.Net中的结构是否支持这一点。
编辑看看,您可以执行此操作,具体取决于您选择的序列化方法。例如,使用XmlSerializer:
System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(Settings));
x.Serialize(Console.Out, settingsItem);
答案 1 :(得分:0)
这个模型很简单,你可能不必处理继承。您可以使用Description
属性标记NonSerialized
,假设我们没有错过任何关于您如何实际执行序列化的内容。
public class Setting
{
public Guid Id { get; set; }
public bool Value { get; set; }
[NonSerialized]
public string Description { get; set; }
}