我有一个带有一堆看起来像这样的值的枚举。请注意,我使用0表示“未定义”。
public enum MyEnum
{
Apple = 1,
Banana = 2,
Orange = 3,
Undefined = 0
}
我想创建一个转换方法,它将接收一个int值并返回枚举,但我想确保如果收到一个不在我的枚举中的值,我将返回“Undefined”。我有以下代码,但如果我通过47,我想确保我得到MyEnum.Undefined。我应该如何修改此代码,以便任何未定义的值返回MyEnum.Undefined。
public static MyEnum GetEnum(int value)
{
var enumValue = MyEnum.Undefined;
if(value > 0)
enumValue = (MyEnum)value;
return enumValue;
}
答案 0 :(得分:4)
只需使用Enum.IsDefined
:
public static MyEnum GetEnum(int value) =>
Enum.IsDefined(typeof(MyEnum), value) ? (MyEnum) value : MyEnum.Undefined;
完整示例:
using System;
public enum MyEnum
{
// Moved here as it's more conventional.
Undefined = 0,
Apple = 1,
Banana = 2,
Orange = 3
}
class Test
{
public static void Main()
{
Console.WriteLine(GetEnum(5)); // Undefined
Console.WriteLine(GetEnum(0)); // Undefined
Console.WriteLine(GetEnum(-1)); // Undefined
Console.WriteLine(GetEnum(3)); // Orange
}
public static MyEnum GetEnum(int value) =>
Enum.IsDefined(typeof(MyEnum), value) ? (MyEnum) value : MyEnum.Undefined;
}
答案 1 :(得分:2)
Enum.IsDefined
可能确实适合您的需求,但了解一些注意事项非常重要:
这些事实使它比一个简单的开关更昂贵:
public static MyEnum GetEnum(int value)
{
var enumValue = (MyEnum)value;
switch (enumValue)
{
case MyEnum.Apple:
case MyEnum.Banana:
case MyEnum.Orange:
return enumValue;
case MyEnum.Undefined:
default:
return MyEnum.Undefined;
}
此代码的危险在于,每当您向枚举添加字段时,您都需要更新它 - 但是枚举几乎总是如此。静态分析器可以在这里提供帮助(例如,ReSharper会发出switch
缺少某些case
的警告。
答案 2 :(得分:0)
请使用:
public static MyEnum GetEnum(int value)
{
return ((Enum.IsDefined(typeof(MyEnum), value)) ? (MyEnum)value : MyEnum.Undefined);
}
或者如果你想使用一个字符串,你可以使用它:
public static MyEnum GetEnumByString(string value)
{
return ((Enum.IsDefined(typeof(MyEnum), value)) ? (MyEnum)value : MyEnum.Undefined);
}