我今天发现了一些让我困惑的事情:
1.如果我有这个:
public interface INamed
{
[XmlAttribute]
string Name { get; set; }
}
public class Named : INamed
{
public string Name { get; set; }
}
它给出以下输出(序列化为元素的名称属性):
<Named>
<Name>Johan</Name>
</Named>
2.如果我有这个:
public abstract class NamedBase
{
[XmlAttribute]
public abstract string Name { get; set; }
}
public class NamedDerived : NamedBase
{
public override string Name { get; set; }
}
XmlSerializer 抛出 System.InvalidOperationException
Member 'NamedDerived.Name' hides inherited member 'NamedBase.Name', but has different custom attributes.
我用来连载的代码:
[TestFixture]
public class XmlAttributeTest
{
[Test]
public void SerializeTest()
{
var named = new NamedDerived {Name = "Johan"};
var xmlSerializer = new XmlSerializer(named.GetType());
var stringBuilder = new StringBuilder();
using (var stringWriter = new StringWriter(stringBuilder))
{
xmlSerializer.Serialize(stringWriter, named);
}
Console.WriteLine(stringBuilder.ToString());
}
}
我的问题是:
我做错了吗?如果是的话,在接口(interface)和抽象类中使用 xml 属性的正确方法是什么?
最佳答案
属性不会在覆盖的属性上继承。您需要重新声明它们。 同样在您的第一个示例中,行为不是您在接口(interface)级别声明 XmlAttribute 时的“预期”行为,但序列化的 xml 包含该值作为元素。因此接口(interface)中的属性被忽略,只有从实际类中获取的信息才重要。
关于c# - 接口(interface)和抽象类中的 Xml 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13182420/