gpt4 book ai didi

c# - XmlRootAttribute 是否可继承?

转载 作者:可可西里 更新时间:2023-11-01 08:18:36 25 4
gpt4 key购买 nike

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

查看文档,它没有说 XmlRoot 使用 AttributeUsageAttribute 将 Inherit 设置为 false(Inherit 应该默认为 true),但是当我尝试反序列化没有 XmlRoot 属性的继承类时出现错误(“ 不是预期的。").

目前有效:

[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; }
}

这行不通,但正是我想要的:

[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; }
}

我可能会尝试反序列化为 InheritedClass 的 XML 如下所示:

<rootNode attributeA="abc">
<elementB>123</elementB>
</rootNode>

最佳答案

Inherited 属性仅表示属性可以 被继承,而不是 被继承。例如,如果您查看 MemberInfo.GetCustomAttributes 的类型签名,这是检索这些属性的最常用方法,它具有以下重载:

public abstract Object[] GetCustomAttributes(bool inherit)

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

但是,如果属性的 AttributeUsage.InheritedtrueGetCustomAttributes 方法仍会忽略它,如果 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);
...
}

因此您可以看到它实际上将 false 传递给 GetCustomAttributes 方法;它在基类中查找属性,即使这些属性是“可继承的”。

关于c# - XmlRootAttribute 是否可继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2076024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com