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

ric*_*i3f 4 c# xml enums bitflags enum-flags

我有一个包含几个标志的XML,其中一些是无符号的32位整数,另一些是无符号的64位整数.其中一些是用逗号分隔的列表编写的,另一些是十六进制的.

看这个例子:

<Color>Blue,Red</Color>
<Color>0xC</Color>
Run Code Online (Sandbox Code Playgroud)

因为我不想编写解析每个枚举的方法,所以我决定使用泛型方法.但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;
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误信息是:

错误1运算符'| ='不能应用于'T'和'T'类型的操作数

有没有办法做到这一点?

Mik*_*ray 8

你正在做很多可以为你做的工作.例如,如果enum使用FlagsAttributethen 声明,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");
}
Run Code Online (Sandbox Code Playgroud)

我用各种标志枚举类型的测试了这个short,intulong后盾值.