【发布时间】:2016-03-10 23:52:20
【问题描述】:
我有以下抽象类的结构:
public abstract class Template
{
// Some properties and methods defined
}
public abstract class Template<TTemplate> : Template where TTemplate : Template
{
// No new properties defined, but methods overriden
}
然后我将这些模板类用作模型的一部分:
public abstract class Model
{
public Template Template {get;set;}
public Model(Template t) {Template = t;}
// More properties and methods
}
public abstract class Model<TModel, TTemplate> : Model where TModel : Model where TTemplate : Template
{
public new TTemplate template {get {return (TTemplate)base.Template;} set {base.Template = value;}}
public Model(TTemplate t) : base(t) {}
// Override some methods but no new properties
}
然后我创建模板和模型的具体类,并在我的项目中使用它们。这些具体类定义了抽象基类中指定的属性之外的附加属性。当需要序列化模型类时,我的问题就出现了。我使用反射来查找所有继承的模型或模板类型,并将它们传递给 XmlSerializer,以便它可以正确序列化我的抽象类。但是,我得到一个例外
There was an error reflecting type **ConcreteModel**.
System.InvalidOperationException:反映属性时出现错误 '模板'。 ---> System.InvalidOperationException:成员 ModelOfConcreteModelConcreteTemplate.ConcreteTemplate 类型的模板隐藏 基类成员 Model.Template 类型的模板。使用 XmlElementAttribute 或 XmlAttributeAttribute 指定新名称。
我在 2003 年遇到了 this post on google groups,它声称可以给出答案,但我不确定如何实施该修复(或者它是否在 13 年后仍然有效)。它确实表明该错误消息具有误导性,因为该消息提出的解决方案不起作用。
如果我从 Model.Template 和类型化的 Model 类中删除“set”访问器(例如,只需通过构造函数设置它),该类就可以很好地序列化 - 尽管没有 Template 属性。有没有一种方法可以对隐藏 a(n)(抽象)基类的属性的类进行 XML 序列化,而无需在每个继承的类上实现 IXmlSerializable?
【问题讨论】:
标签: c# xml inheritance