3

我重构了这样的代码:

public string CamelCASE { get; set; }

到:

public string CamelCase {get; set; }

只发现输入 XML 包含前一个大小写(我们称它为叫喊的骆驼)。我无法控制 XML 文档的生成方式。我也不会渴望收回我的更改。

我想将响亮的骆驼属性映射到轻声说话的属性。

我已经尝试过XmlElementXmlMapping但没有取得更大的成功。谷歌搜索只给了我关于如何将东西映射到属性的点击,按照这篇文章的内容。但是,我只需要将 <LoudCAMEL>之类的东西反序列化为属性公共字符串 QuietCamel

有没有一种顺利的方法呢?

编辑

添加属性后如下:

using System.Collections.Generic;
using System.Xml;

public class Beep : SuperBeep
{
  private readonly BeepType _a;

  public Beep() { _a = BeepType.SomeSome; }
  public Beep(BeepType input) { _a = input; }
  ~Beep() { }
  public override void Dispose() { }

  public BeepType Aaa { get { return _a; } }

  [XmlElement("CamelCASE")]
  public bool CamelCase { get; set; }
}

我可以看到红色的波浪形高光告诉我Cannot access constructor 'XmlElement' here due to its protection level。但是,当我编译时,我让 IDE 大声喊叫'System.Xml.XmlElement' is not an attribute class

坦率地说,我对使用属性的建议(这是针对 .NET 2.0)感到有些困惑,因为我的印象是 3.5 之前的 .NET 无法使用属性。我弄错了吗?

4

2 回答 2

5
[XmlElement("CamelCASE")]
public string CamelCase { get; set; }

如果您在 xml 中保留响亮的名称,应该是您所需要的。如果您想在的 xml 中使用更安静的名称,但允许名称仍然有效,它会变得更加复杂。你可以使用:

public string CamelCase { get; set; }

[XmlElement("CamelCASE"), Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public string CamelCaseLegacy {
    get { return CamelCase; }
    set { CamelCase = value; }
}
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeCamelCaseLegacy() { return false; }

序列化时,CamelCase属性会序列化为<CamelCase>CamelCaseLegacy元素会因ShouldSerialize*方法而被忽略。但是,在反序列化时,只要看到该CamelCaseLegacy属性就会使用该属性<CamelCASE>。然后我们将该值映射回CamelCase属性。

于 2014-07-21T11:58:13.903 回答
2

您指的是错误的命名空间。

消除

using System.Xml;

并添加

using System.Xml.Serialization;
于 2016-08-17T12:19:55.503 回答