C#枚举的ValidationAttribute
我有以下列举:C#枚举的ValidationAttribute,c#,enums,C#,Enums,我有以下列举: public enum FirstEnum : short { Unknown = -1, Red = 2, Green = 3 } public enum SecondEnum { Unknown = -1, Orange = 2, Apple = 3 } 现在我想编写一个数据注释属性,以便验证属性。假设我有一门课: public class MyClass { [EnumValidation(AllowUnKnow
public enum FirstEnum : short
{
Unknown = -1,
Red = 2,
Green = 3
}
public enum SecondEnum
{
Unknown = -1,
Orange = 2,
Apple = 3
}
现在我想编写一个数据注释属性,以便验证属性。假设我有一门课:
public class MyClass
{
[EnumValidation(AllowUnKnown = true)]
public FirstEnum First { get; set; }
[EnumValidation(AllowUnKnown = false)]
public SecondEnum Second { get; set; }
}
我的验证属性如下所示:
public class EnumValidationAttribute : ValidationAttribute
{
public bool AllowUnKnown { get; set; }
public override bool IsValid(object aValue)
{
bool valid = true;
int enumValue = (int) aValue; //** Cannot do hard cast
if (enumValue == -1 && !AllowUnKnown)
valid = false;
return valid;
}
}
所以现在问题来了,我不能再把枚举成员硬转换成int,因为FirstEnum是一个短的
那么,如何安全地确定枚举成员的值呢?(我无法更改FirstEnum的声明)首先,您不能为
字节
变量使用-1
值,然后您应该将未知
值更改为任何其他有效的字节
<代码>第一个枚举不可编译
此外,您还可以使用Convert.ToInt32
方法将字节值转换为整数。实际上,下一个代码将true
写入控制台:
byte x1 = 1;
object o1 = x1;
Console.WriteLine(Convert.ToInt32(o1) == 1);
因此,您可以通过转换实现您的方法:
public override bool IsValid(object aValue)
{
int enumValue = Convert.ToInt32(aValue);
return !(enumValue == -1 && !AllowUnKnown);
}
首先,您不能为
字节变量使用-1
值,然后您应该将未知值更改为任何其他有效的字节
<代码>第一个枚举
不可编译
此外,您还可以使用Convert.ToInt32
方法将字节值转换为整数。实际上,下一个代码将true
写入控制台:
byte x1 = 1;
object o1 = x1;
Console.WriteLine(Convert.ToInt32(o1) == 1);
因此,您可以通过转换实现您的方法:
public override bool IsValid(object aValue)
{
int enumValue = Convert.ToInt32(aValue);
return !(enumValue == -1 && !AllowUnKnown);
}
这是否有效:
int enumValue = Convert.ToInt32(b);
这是否有效:
int enumValue = Convert.ToInt32(b);
这是否有效:intenumvalue=Convert.ToInt32(b)代码>字节和-1?byte.MinValue为0。甚至编译器也会抛出错误。为什么需要字节作为枚举?@Klaudiuszbryjamus我的坏。。。“我的意思是短时间的。”彼得格尔肯斯的作品完美无瑕。不知道我怎么会错过。爱它,当它如此简单。测试长,短,字节(是的,我意识到-1问题),int和所有都很好。如果您想将其添加为所选答案,很乐意将其标记为所选答案。是否有效:int enumValue=Convert.ToInt32(b)代码>字节和-1?byte.MinValue为0。甚至编译器也会抛出错误。为什么需要字节作为枚举?@Klaudiuszbryjamus我的坏。。。“我的意思是短时间的。”彼得格尔肯斯的作品完美无瑕。不知道我怎么会错过。爱它,当它如此简单。测试长,短,字节(是的,我意识到-1问题),int和所有都很好。如果您想将其添加为所选答案,很高兴将其标记为所选答案。此外,使用Unknown
be0
是很好的枚举实践--这是默认的初始化值。@Peter不幸的是,系统已将0用于“All”条件,因此此时无法更改。另外,使用Unknown
be0
是一种很好的枚举做法——这是默认的初始化值。@Peter很遗憾,系统已将0用于“全部”条件,因此此时无法更改。