C# 多个抽象类的相同KnownType属性

C# 多个抽象类的相同KnownType属性,c#,serialization,reflection,attributes,C#,Serialization,Reflection,Attributes,我想知道是否可以将同一类作为knowntype添加到多个抽象类中 目前我的问题是,我在同一命名空间中有两个抽象类: 让我们把这个名称空间称为“东西” 我有两个抽象的类,水果和蔬菜 这两个抽象类都由同一名称空间中的两个不同类继承,但名称相同。“西红柿” 因此,我有两项声明: namespace Thing [KnownType(typeof(Tomato))] public abstract class Fruit {} public sealed class Tomato: Fruit{}

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

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

让我们把这个名称空间称为“东西”

我有两个抽象的类,水果和蔬菜

这两个抽象类都由同一名称空间中的两个不同类继承,但名称相同。“西红柿”

因此,我有两项声明:

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”

我已经将番茄的两个声明重构到它自己的文件中,现在是一个声明。现在所有内容都将序列化,但是当我查看两个抽象类的自定义属性时,只有其中一个将获得knowntype属性。这个类也将是唯一一个知道它有番茄子类的类


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

C#不支持多重继承。
番茄不能同时从水果和蔬菜继承,因此KnownType属性只能由基类使用。

C#不支持多重继承。
番茄不能同时从水果和蔬菜中继承,因此KnownType属性只能由基类使用。

我没有使用多个接口(这会更好),而是决定链继承两个抽象类。我对如何实现多接口继承的序列化(到处都是大量的代理,有很多遗留内容)没有足够的了解。在我最初的示例中,可能是这样的:

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{}

我没有使用多个接口(这会更好),而是决定链继承两个抽象类。我对如何实现多接口继承的序列化(到处都是大量的代理,有很多遗留内容)没有足够的了解。在我最初的示例中,可能是这样的:

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{}

您甚至不能在同一名称空间中有两个名为Tomato的类……对,我认为这是可疑的,因为我继承了代码。从那以后,我将tomato重构为命名空间中的一个声明。您能显示更改后的代码吗?因为如果你把番茄重构成一个声明,这不意味着你现在只有一个番茄类吗?你是对的,我犯了一个错误。让我看一下这段代码,然后再给你回复。原来它们在不同的名称空间中,但它们应该在同一个名称空间中。尽管复制很糟糕,但我不确定解决方法是否更好。但是,该解决方案在允许序列化的同时保持了功能的完整性。您甚至不能在同一命名空间中有两个名为Tomato的类……对,我认为这是可疑的,因为我继承了代码。从那以后,我将tomato重构为命名空间中的一个声明。您能显示更改后的代码吗?因为如果你把番茄重构成一个声明,这不意味着你现在只有一个番茄类吗?你是对的,我犯了一个错误。让我看一下这段代码,然后再给你回复。原来它们在不同的名称空间中,但它们应该在同一个名称空间中。尽管复制很糟糕,但我不确定解决方法是否更好。但是,该解决方案在允许序列化的同时保持了功能的完整性。由于不支持多重继承,我唯一的选择是在单独的名称空间中复制声明吗?这取决于您想做什么。如果您真的需要一个西红柿类既可以用作蔬菜也可以用作水果,那么多个西红柿类将无法完成这项工作。我认为您需要定义IFruit和IVegetable接口,并在tomato类中实现它们。由于不支持多重继承,我唯一的选择是在单独的名称空间中复制声明吗?这取决于您想做什么。如果您真的需要一个西红柿类既可以用作蔬菜也可以用作水果,那么多个西红柿类将无法完成这项工作。我认为您需要定义IFruit和IVegetable接口,并在番茄类中实现它们。