【问题标题】:How to represent composite Flagged Enum values in XML config file如何在 XML 配置文件中表示复合标记枚举值
【发布时间】:2016-12-22 22:01:42
【问题描述】:

如果我有一个标记的枚举,让我们说参数

[Flags]
public enum Shipping { Null=0x00, FedX=0x01, UPS=0x02, AirBrn=0x04, USPS=0x08, Any=0xFF}

我想将此值存储在 Xml 配置文件中,例如

  [XmlAttribute(AttributeName="shipper")]
  public Shipping ShippingOption { get; set; }

我知道我必须用空格分隔组合值,例如,如果我希望配置文件将 ShippingOption 表示为 FedX 或 UPS,那么 Xml 将如下所示:

  <ElementName shipper="FedX UPS" />

或者如果我希望它代表 FedX、UPS 或 USPS,那么

  <ElementName shipper="FedX UPS USPS" />

但是,如果我希望它不是 UPS,我应该在属性中添加什么? (假设枚举没有预定义的值(如Shipping.Any) 这将相当于 c# 值

       var ship = Shipping.Any & ^Shipping.UPS;

我知道我可以省略我不想要的,像这样:

 <ElementName shipper="FedX USPS AirBrn " /> 

但是,如果枚举中有很多成员会变得乏味,(并且在完整列表扩展的任何时候都需要维护)。是否有一种简单的方法来表示标记的枚举的否定?

【问题讨论】:

  • 仅供参考,我是FedEx
  • 哦,谢谢,这很有帮助。
  • 我会使用标志的复合 int 值并将其写为属性值。
  • 你的意思是像&lt;ElementName shipper="0xc7" /&gt; ?那行得通吗?我想我会试试的。虽然它的可读性较差。

标签: c# .net xml enums flags


【解决方案1】:

这是一个应该可行的相当粗略的解决方案。首先,编写一个解析自定义枚举语法的方法——在我的实现中,~X 的意思是“而不是X”:

private T ParseEnum<T>(string str) where T : struct, IConvertible
{
    var result = 0;
    foreach (var name in str.Split())
    {
        if (name.StartsWith("~"))
        {
            result &= ~(int)(Enum.Parse(typeof(T), name.Substring(1), true));
        }
        else
        {
            result |= (int)(Enum.Parse(typeof(T), name, true));
        }
    }

    return (T)(object)result;
}

这是一个非常简单的格式函数,它与原始的 XML 序列化兼容:

private string FormatEnum<T>(T s) where T : struct, IConvertible
{
    return s.ToString().Replace(",", "");
}

现在只需在需要使用它的任何地方设置一个代理属性,并确保使用XmlIgnore 标记原始属性:

[XmlIgnore]
public Shipping ShippingOption { get; set; }

[XmlAttribute(AttributeName = "shipper")]
public string ShippingOptionString
{
    get { return FormatEnum<Shipping>ShippingOption); }
    set { ShippingOption = ParseEnum<Shipping>(value); }
}

现在它可以像这样正确解析 XML:

<ElementName shipper="Any ~UPS" />

针对不同的序列化库存在其他解决方案,但模式基本相同。将 XML 属性反序列化为字符串,然后使用自定义解析器对其进行解析以获得所需的枚举结果。

【讨论】:

  • 谢谢!这正是我所需要的。我觉得有点傻我自己没有想到,我已经用这个技术解决了其他Xml序列化问题,只是没有想到!但这是我第一次听说proxy property这个词。
猜你喜欢
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 2010-10-05
  • 2019-02-28
  • 1970-01-01
  • 2021-03-25
相关资源
最近更新 更多