我们正在尝试使用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
答案 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;
}