XmlRootAttribute是可继承的吗?

M. *_*ley 13 c# inheritance attributes xmlserializer

我有一个用C#的XmlSerializer序列化的类.它标有XmlRoot属性,我想在派生类中继承此属性.

查看文档时,它没有说XmlRoot使用AttributeUsageAttribute将Inherit设置为false(Inherit应该默认为true),但是在尝试反序列化没有XmlRoot属性的继承类时出错("<rootNode xmlns ='' >没想到.").

这目前有效:

[Serializable()]
[XmlRoot("rootNode")]
public class BaseClass
{
    [XmlAttribute("attributeA")]
    public int A { get; set; }
}

[Serializable()]
[XmlRoot("rootNode")]
public class InheritedClass : BaseClass
{
    [XmlElement("elementB")]
    public int B { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,但我想要的是:

[Serializable()]
[XmlRoot("rootNode")]
public class BaseClass
{
    [XmlAttribute("attributeA")]
    public int A { get; set; }
}

[Serializable()]
public class InheritedClass : BaseClass
{
    [XmlElement("elementB")]
    public int B { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我可能会尝试将反序列化的XML InheritedClass看起来像这样:

<rootNode attributeA="abc">
    <elementB>123</elementB>
</rootNode>
Run Code Online (Sandbox Code Playgroud)

Aar*_*ght 25

Inheritedpropertly仅仅表明该属性可以被继承,而不是它是.例如,如果您查看类型签名MemberInfo.GetCustomAttributes,这是检索这些属性的最常用方法,则会出现此重载:

public abstract Object[] GetCustomAttributes(bool inherit)
Run Code Online (Sandbox Code Playgroud)

如果参数inherittrue,那么该方法将搜索继承链,即,如果查看的特定类型没有,它将查看基类或任何祖先类是否具有该属性.为了使此方法在继承的类上查找属性,不能设置属性类本身AttributeUsage.Inherited = false.

但是,如果属性AttributeUsage.Inheritedtrue,则GetCustomAttributes方法仍然会在inherit参数为时忽略它false.

换句话说,AttributeUsage.Inherited权限,而不是要求.完全由任何人调用GetCustomAttributes(或类似的方法)来决定是否获得继承的属性.你无法控制它.我相当肯定(不是100%肯定)XmlSerializer不寻找继承属性.

也许不是你想要的答案,但你有; 看起来你已经找到了解决方法.

顺便说一句,它与XML序列化一起XmlSerializer使用的方式是使用XmlReflectionImporter它反过来获取一个实例XmlAttributes.这是构造函数的样子XmlAttributes(在Reflector之外):

public XmlAttributes(ICustomAttributeProvider provider)
{
    this.xmlElements = new XmlElementAttributes();
    this.xmlArrayItems = new XmlArrayItemAttributes();
    this.xmlAnyElements = new XmlAnyElementAttributes();
    object[] customAttributes = provider.GetCustomAttributes(false);
    ...
}
Run Code Online (Sandbox Code Playgroud)

所以你可以看到它确实将false传递给了GetCustomAttributes方法; 它并没有寻求在基类的属性,即使这些属性是"继承".

  • 彻底的回应,我感谢背景。谢谢! (2认同)