使用带有枚举的Foolproof RequiredIf

时间:2014-12-03 23:34:48

标签: c# enums data-annotations foolproof-validation

我们正在尝试使用Foolproof验证注释[RequiredIf]来检查是否需要电子邮件地址。我们还创建了一个枚举,以避免在ViewModel中使用查找表ID。代码如下所示:

public enum NotificationMethods {
        Email = 1,
        Fax = 2
}

然后在ViewModel中:

[RequiredIf("NotificationMethodID", NotificationMethods.Email)]
public string email {get; set;}

在此期间,当电子邮件未填充但选择作为通知类型时,我们不会收到错误。相反,这可以按预期工作:

[RequiredIf("NotificationMethodID", 1)]
public string email {get; set;}

我发现的唯一其他参考资料是:https://foolproof.codeplex.com/workitem/17245

1 个答案:

答案 0 :(得分:5)

鉴于您的方法NotificationMethodID返回int,检查失败的原因是,在c#中,每个enum都是自己的类型,继承自{{3} }。即如果你这样做

var value = NotificationMethods.Email;
string s = value.GetType().Name;

您会看到s的值"NotificationMethods"不是"Int32"

如果尝试直接检查int与enum的相等性,则会出现编译错误:

var same = (1 == NotificationMethods.Email); // Gives the compiler error "Operator '==' cannot be applied to operands of type 'int' and 'NotificationMethods'"

如果System.Enum首先是enum和int值(当它们被传递给box的构造函数时会发生这种情况),那么就没有编译器错误,但Equals()返回false,因为类型不同:

var same = ((object)1).Equals((object)NotificationMethods.Email);
Debug.WriteLine(same) // Prints "False".

要检查基础整数值的相等性,您可以在装箱前将NotificationMethods.Email显式转换为整数:

var same = ((object)1).Equals((object)((int)NotificationMethods.Email));
Debug.WriteLine(same); // Prints "True"

在属性应用程序中:

[RequiredIf("NotificationMethodID", (int)NotificationMethods.Email)]
public string email {get; set;}

您可能还会考虑使用const int值代替枚举:

public static class NotificationMethods
{
    public const int Email = 1;
    public const int Fax = 2;
}