3

次のようにコードをリファクタリングしました。

public string CamelCASE { get; set; }

に:

public string CamelCase {get; set; }

入力 XML に前者のケーシングが含まれていることを発見するだけです (叫ぶラクダと呼びましょう)。XML ドキュメントがどのように生成されるかは、私には制御できません。また、変更を撤回したいという欲求もありません。

うるさいラクダのプロパティを静かに話すプロパティにマッピングしたいと思います。

XmlElementXmlMappingを試しましたが、それほど成功しませんでした。グーグルで調べたところ、この投稿の行に沿って、ものを属性にマップする方法についてヒットしただけでした。ただし、<LoudCAMEL>のようなものだけをプロパティpublic string 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; }
}

保護レベルが原因で、コンストラクター 'XmlElement' にアクセスできません という赤い波状のハイライトが表示されます。ただし、コンパイルすると、 「System.Xml.XmlElement」は属性クラスではないと IDE が大声で叫びます。

率直に言って、バージョン 3.5 より前の .NET では属性を使用できないという印象を持っていたので、属性を使用するという提案 (これは .NET 2.0 を対象としています) に少し混乱しています。私は間違っていますか?

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 に答える