使用字段或属性作为 xmlnode 值

本文关键字:xmlnode 属性 字段 | 更新日期: 2023-09-27 17:57:12

>我正在尝试创建一个 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 的情况下获得双精度值或其他值?

下面显示了我的类代码的各个部分:

[Serializable]
public struct Angle
{
    [XmlAttribute]
    public UnitType Unit;
    public double Radian
    {
        get;
        set;
    }
    public bool ShouldSerializeRadian();
    public double Degree
    {
        get;
        set;
    }
    public bool ShouldSerializeDegree();
}

与单位和应该序列化我选择要使用的值。

当我设置度数 = 90 时,弧度的值将是 1.5707...

UnitType 是具有度数和弧度的枚举。 是 unit = unittype.degree 度 在序列化时使用,当 unit = unittype.radian 在序列化时使用 radain。

我用来选择我使用的表示形式的代码如下:

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

使用字段或属性作为 xmlnode 值

不确定这是否是最佳解决方案,但您可以创建一个代理属性来处理丝化/反序列化。

类似的东西

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