0

私はAngleクラスを作ろうとしています。このクラスを xml にシリアル化するときは、次のことを行います。

<Angle Unit="Degree">90</Angle>

or

<Angle Unit="Radian">3.14......</Angle>

現在、クラスをシリアル化すると、次のようになります。

<Angle Unit="Degree">
  <Degree>90</Degree>
</Angle>

or

<Angle Unit="Radian">
  <Radian>90</Radian>
</Angle>  

[XmlText] を使用した文字列が可能であることはわかっていますが、カスタム xmlwrite および xmlread を作成する必要なく、double またはその他の値を取得する方法はありますか?

以下は私のクラスコードの一部を示しています:

[Serializable]
public struct Angle
{
    [XmlAttribute]
    public UnitType Unit;

    public double Radian
    {
        get;
        set;
    }
    public bool ShouldSerializeRadian();

    public double Degree
    {
        get;
        set;
    }
    public bool ShouldSerializeDegree();
}

Unit と shouldSerialize を使用して、使用する値を選択します。

度 = 90 に設定すると、ラジアンの値は 1.5707 になります...

UnitType度とラジアンを持つ列挙型です。is unit = unittype.degreedegree は連載時に、unit = unittype.radianradain は連載時に使用されます。

私が使用する表現を選択するために使用するコードは次のとおりです。

public bool ShouldSerializeRadian() 
{ 
   return (Unit == UnitType.Radian); 
}
4

1 に答える 1

1

これが最善の解決策かどうかはわかりませんが、シリアライゼーション/デシリアライゼーションを処理する代理プロパティを作成できます。

何かのようなもの

[Serializable]
public class Angle 
{
    [XmlAttribute]
    public UnitType Unit;

    [XmlTextAttribute]
    public double Value
    {
        get { return Unit == UnitType.Degree ? Degree : Radian; }
        set
        {
            if (Unit == UnitType.Degree)
            {
                Degree = value;
                return;
            }
            Radian = value;
        }
    }

    [XmlIgnore]
    public double Radian { get; set; }

    [XmlIgnore]
    public double Degree { get; set; }
}

結果:

  <Angle Unit="Radian">70.8</Angle> 
  <Angle Unit="Degree">45.2</Angle>

于 2013-02-03T23:40:33.987 に答える