解析使用'Flags'归因的.NET枚举字符串或int值的方法

Sch*_*999 15 .net c# parsing enumeration

使用以下方法可以很好地计算枚举元素:

// memberType is enum type
if (Enum.IsDefined(memberType, valueString))
{
    return Enum.Parse(memberType, valueString);
}
else
{
    try 
    {
        var underlyingValue = Convert.ChangeType(valueString, Enum.GetUnderlyingType(memberType));
        if (Enum.IsDefined(memberType, underlyingValue))
        {
            return underlyingValue;
        }
    }
    catch...
}
Run Code Online (Sandbox Code Playgroud)

这就像魅力一样.除了使用标记的枚举构建的值FlagsAttribute.例如,对于此枚举和值:

[Flags]
enum MyEnum {
    One = 0x1,
    Two = One << 1,
    Four = One << 2,
    Eight = One << 3
}

var e = MyEnum.One | MyEnum.Eight;
Run Code Online (Sandbox Code Playgroud)

上面的方法不起作用.看起来让它工作的唯一方法是尝试获取所有枚举值,并使用输入值按位和它们.但这有点单调乏味.所以你知道更好的方法吗?

回答:

最终方法如下所示:

var parsed = Enum.Parse(memberType, valueString);
decimal d;
if (!decimal.TryParse(parsed.ToString(), out d))
{
    return parsed;
}
throw new ArgumentOutOfRangeException(memberInfo.Name, valueString, "Bad configuration parameter value.");
Run Code Online (Sandbox Code Playgroud)

SwD*_*n81 4

我想问一个更好的问题,如何检测坏值。

简而言之,C# 4.0 中似乎找到了一个很好的解决方法。从这里。将整数值解析为枚举后,您可以使用它并查看该值是否有效。这适用于组合标志。

static bool IsFlagDefined(Enum e)
{
    decimal d;
    return !decimal.TryParse(e.ToString(), out d);
}
Run Code Online (Sandbox Code Playgroud)