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)
如果参数inherit是true,那么该方法将搜索继承链,即,如果查看的特定类型没有,它将查看基类或任何祖先类是否具有该属性.为了使此方法在继承的类上查找属性,不能设置属性类本身AttributeUsage.Inherited = false.
但是,如果属性AttributeUsage.Inherited为true,则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方法; 它并没有寻求在基类的属性,即使这些属性是"继承".
| 归档时间: |
|
| 查看次数: |
2927 次 |
| 最近记录: |