这是我的班级图。
问题出在AgendaInstance
(参见红点)。我正在尝试继承(重用)Agenda.Tasks
来包含自己的任务,类型为TaskInstance
,子类型为Task
。
我可以将this.Tasks.Add(new TaskInstance());
放在AgendaInstance
内。该代码有效,但当我尝试序列化或绑定时,问题就出现了。由于Tasks
静态绑定到Task
所有被序列化(例如,到xml)或绑定(例如,到网格行)的是Task
的属性,而不是{{1} }。
我可以使用这种设计模式来解决这个问题吗?我不想在TaskInstance
中影子(新)Tasks
。这将破坏拥有继承层次结构的目的。我的midi-chlorians告诉我,有一个解决方案比直接处理序列化或绑定细节更高;这是一个“更深层次”的问题,有助于实现更根本的解决方案。我打算用仿制药来捣乱,但也许你知道更好的方式或更好的模式。
答案 0 :(得分:1)
我使用xml序列化的90%经验都很糟糕。它们倾向于破坏继承模型并且不支持接口。因此,它会导致您破解和修改现有类以适应序列化。在处理它时,XmlIgnore
和重复的属性通常会出现。
因此,我通常只为序列化目的创建另一个类。例如:AgendaSerializable
,TaskSerializeable
为任务。好处是:保持继承和数据模型的清洁,同时需要处理数据转换作为缺点。
可能是你的力量。
答案 1 :(得分:0)
您可以在Agenda
上Task
通用,如下所示:
class Agenda<T> where T : Task {
public IList<T> Tasks {get; private set;}
...
}
class AgendaInstance<TaskInstance> {
...
}
现在层次结构中只有一个Task
属性。但是,Agenda
需要实例化一个类型参数,所以过去常常是&#34; plain&#34; Agenda
变为Agenda<Task>
。