是否可以使用 KnownType 的类名而不是父类作为标签?例如
这是较大 DataContract xml 文件的摘录,
[DataContract (Namespace = "projectNamespace")]
[KnownType(typeof(Warning)), KnownType(typeof(Error))]
public abstract class Message
{
protected Message(LogLevel logLevel, int percentUsed, string message)
{
this.LogLevel = logLevel;
this.LogMessage = message;
this.Percent = percentUsed;
}
internal readonly LogLevel LogLevel;
[DataMember] internal readonly int Percent;
[DataMember] internal readonly string LogMessage;
}
[DataContract (Name="Warning", Namespace = "projectNamespace")]
internal sealed class Warning : Message
{
public Warning(int percentUsed, string message) : base(LogLevel.Warn, percentUsed, message)
{
}
}
[DataContract(Name = "Error", Namespace = "projectNamespace")]
internal sealed class Error : Message
{
public Error(int percentUsed, string message) : base(LogLevel.Error, percentUsed, message)
{
}
}
public enum LogLevel
{
Warn, Error
}
我所看到的:
<messages>
<Message i:type="Warning">
<PercentUsed>75</PercentUsed>
<LogMessage>75% used</LogMessage>
</Message>
<Message i:type="Error">
<PercentUsed>100</PercentUsed>
<LogMessage>0% remaining</LogMessage>
</Message>
</messages>
预期:
<messages>
<Warning>
<PercentUsed>75</PercentUsed>
<LogMessage>75% used</LogMessage>
</Warning>
<Error>
<PercentUsed>100</PercentUsed>
<LogMessage>0% remaining</LogMessage>
</Error>
</messages>
注意该消息如何具有令人讨厌的
i:type="Error"
而不仅仅是 <Error>
您实施的方法很好。您已经实现了派生运行时类型的单个对象的多态性。
你认为你想要的东西是错误的。对你来说看似多余的东西绝对是必要且信息丰富的。在
<Message i:type="Warning">
中,标签Message
表示抽象基类型。属性值 Warning
表示从 Message
派生的实例运行时类型。如果 XML 不包含基类的名称 Message
,则代码项目机制甚至不会搜索已知类型 的集合。代码应该如何“知道”在哪里寻找它们?
然而,通过缩短“明显”(不,根本不明显)来“改进”数据契约 XML 的尝试就是整个现象。为什么这里有“临时”方法?为什么你认为这种混乱可以改善任何事情?我无法理解你们。 您已经很好地完成了合同并产生了正确的结果,所以我建议您接受我的回答并关闭问题。