多个抽象类的相同KnownType属性

时间:2013-12-02 15:21:55

标签: c# serialization reflection attributes

我想知道我是否可以将同一个类作为知识类添加到多个抽象类中。

我目前的问题是我在同一名称空间中有两个抽象类:

让我们称这个命名空间为“Thing”

我在Thing,Fruit and Vegetable中有两个抽象类。

这两个抽象类都由同一名称空间中的两个不同的类继承,但具有相同的名称。 “番茄”

所以我有两个声明:

namespace Thing

[KnownType(typeof(Tomato))]
public abstract class Fruit {}

public sealed class Tomato: Fruit{}

以及

namespace Thing

[KnownType(typeof(Tomato))]
public abstract class Vegetable {}

public sealed class Tomato: Vegetable{}

类型'Thing.Tomato'无法添加到已知类型列表中,因为已存在具有相同数据协定名称“{datacontractname:Tomato}”的其他类型“Thing.Tomato”。

我已经将Tomato的两个声明重构为它自己的文件,现在只有一个声明。现在一切都会序列化,但是当我查看两个抽象类的自定义属性时,只有其中一个将获得knowntype属性。该类也将是唯一知道它具有Tomato子类的人。

编辑:我对我的重构有点太仓促,因为我需要Tomato来进行多重继承。目前我已将名称空间Thing更改为Thing.Fruit和Thing.Vegetable,保留多个声明。代码的重复使我怀疑这是一个很好的解决方案。

2 个答案:

答案 0 :(得分:1)

C#不支持多重继承。 Tomato不能继承Fruit和Vegetable,因此KnownType属性只能由基类使用。

答案 1 :(得分:0)

我决定链接继承几个抽象类,而不是使用多个接口(本来会更好)。我对我们如何进行序列化(大量具有大量遗留内容的代理)以实现多接口继承没有足够的理解。在我原来的例子中,它应该是:

namespace Thing

[KnownType(typeof(Tomato))]
public abstract class Fruit : Vegetable { }

public sealed class Tomato : Fruit{}

namespace Thing

[KnownType(typeof(Tomato))]
public abstract class Vegetable {}

public sealed class Carrot : Vegetable{}