Есть хороший способ выяснить элемент перечисления, используя следующий подход:
// 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...
}
Это работает как шарм.За исключением значений, построенных из перечислений, отмеченных FlagsAttribute
.Например, для этого перечисления и значения:
[Flags]
enum MyEnum {
One = 0x1,
Two = One << 1,
Four = One << 2,
Eight = One << 3
}
var e = MyEnum.One | MyEnum.Eight;
подход, описанный выше, не работает.Похоже, что единственный способ заставить его работать, это попытаться получить все значения перечисления и побитовые И их с входным значением.Это несколько утомительно, хотя.Так вы знаете какой-нибудь лучший способ?
Ответ:
Последний метод выглядит следующим образом:
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.");