Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#枚举的ValidationAttribute_C#_Enums - Fatal编程技术网

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
be
0
是很好的枚举实践--这是默认的初始化值。@Peter不幸的是,系统已将0用于“All”条件,因此此时无法更改。另外,使用
Unknown
be
0
是一种很好的枚举做法——这是默认的初始化值。@Peter很遗憾,系统已将0用于“全部”条件,因此此时无法更改。