c# - 从逗号分隔的列表或整数中解析枚举标志

标签 c# xml enums enum-flags bitflags

我有一个包含多个标志的 XML,其中一些是无符号 32 位整数,另一些是无符号 64 位整数。其中一些以逗号分隔的列表形式编写,而另一些则以十六进制形式编写。

看这个例子:

<Color>Blue,Red</Color>
<Color>0xC</Color>

因为我不想编写一个方法来解析每个枚举,所以我决定使用通用方法。但是 Visual Studio 不允许我构建解决方案。这是我的方法:

public static T ParseFlags<T>(string value) where T : struct
{
    T result = (T)((object)0);
    string[] array;
    // Remove white spaces and delimit string if it is comma-separated
    if (ParseDelimitedString(value, ',', out array))
    {
        for (int i = 0; i < array.Length; i++)
        {
            T flag = (T)((object)0);
            // Check if value is member of enumeration
            if (Enum.TryParse<T>(array[i], out flag))
            {
                result |= (T)((object)flag);
            }
        }
    }
    else
    {
        switch (Type.GetTypeCode(Enum.GetUnderlyingType(typeof(T))))
        {
            // Remove hex characters and parse node's inner text
            case TypeCode.UInt32:
                result = (T)((object)ParseUint(value));
                break;
            case TypeCode.UInt64:
                result = (T)((object)ParseUlong(value));
                break;
        }
    }
    return result;
}

我得到的错误信息是:

Error 1 Operator '|=' cannot be applied to operands of type 'T' and 'T'

有办法吗?

最佳答案

您正在做很多可以为您完成的工作。例如,如果您的 enum 是使用 FlagsAttribute 声明的,那么 Enum.Parse 将为您解析逗号分隔值。

public static T ParseFlags<T>(string value) where T : struct
{
    T result;
    ulong temp;
    if (Enum.TryParse(value, out result))
    {
        return result;
    }

    string hexNum = value.StartsWith("0x") ? value.Substring(2) : value;
    if (ulong.TryParse(hexNum, NumberStyles.HexNumber, null, out temp))
    {
        return (T)Enum.ToObject(typeof(T), temp);
    }

    throw new ArgumentException("value could not be parsed");
}

我使用具有 shortintulong 后备值的各种 Flags 枚举类型对此进行了测试。

关于c# - 从逗号分隔的列表或整数中解析枚举标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180291/

相关文章:

php - 如何在 PHP 中编写一个 foreach 循环来计算具有不同元素的 XML 元素的值?

javascript - 使用 Javascript 或 jQuery - 查找具有正确属性日期范围的节点

c# - C# 属性的最具创新性的用法

c# - 需要一种按日期对100 GB日志文件进行排序的方法

xml - 不使用默认命名空间的没有前缀的 XSL 输出 XML?

java - neo4j 动态关系类型,不使用枚举

c# - 在 C++\CLI 中转换枚举的问题

enums - 修改选项的值并获取引用

c# - 按值从列表中删除项目

c# - 当 CultureInfo 设置为其他语言时,字符串未被识别为有效日期时间