我有以下枚举,我需要根据客户端选择进行验证
[Flags]
enum Colour
{
Black = 1,
Blue = 2,
Green = 4,
Yellow = 8
}
var isValid = Enum.IsDefined(typeof(Colour), 5);
如果5是有效值,为什么返回false(Colour.Black | Colour.Green)
答案 0 :(得分:1)
因为这是正确的结果。 "如果enumType是使用FlagsAttribute属性定义的枚举,如果设置了value中的多个位字段但是value不对应于复合枚举值,或者value是字符串串联,则该方法返回false多位标志的名称。" 有关IsDefined如何工作的详细信息,请参阅MSDN。
UPD:任何枚举的解决方案:
static class EnumExtensions
{
public static bool IsSuitable(Type enumType, int value)
{
if (!enumType.IsEnum)
{
throw new ArgumentException(nameof(enumType));
}
var entities = Enum.GetValues(enumType);
int composite = 0;
foreach (var entity in entities)
{
composite |= (int)entity;
}
return (composite | value) == composite;
}
}
它给出了这个结果:
var suit = EnumExtensions.IsSuitable(typeof(Colour), 5); // true
var suit2 = EnumExtensions.IsSuitable(typeof(Colour), 333); //false
答案 1 :(得分:1)
Enum.IsDefined()函数的返回值取决于枚举定义。 实际上,如果'5'在您定义的枚举的值集合中,则会进行检查。
答案 2 :(得分:0)
[Flags]
enum Colour
{
Black = 1, // 0001
Blue = 2, // 0010
Green = 4, // 0100
Yellow = 8 // 1000
}
static void Main(string[] args)
{
var isValid = Enum.IsDefined(typeof(Colour), 5); // 5 is 0101
}
Enum.IsDefined: 返回指定枚举中是否存在具有指定值的常量的指示。
在你的例子中,你有值1,2,4,8,为什么你认为值5应该返回true?
[Flags]
enum Colour
{
Black = 1,
Blue = 785,
Green = 4,
Yellow = 666
}
static void Main(string[] args)
{
var isValid = Enum.IsDefined(typeof(Colour), 666); // true
var isValid2 = Enum.IsDefined(typeof(Colour), 785); // true
var isValid3 = Enum.IsDefined(typeof(Colour), 5); // false
}