gpt4 book ai didi

c# - 将万无一失的 RequiredIf 与枚举一起使用

转载 作者:太空狗 更新时间:2023-10-30 01:03:39 26 4
gpt4 key购买 nike

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

最佳答案

鉴于您的方法 NotificationMethodID 正在返回一个 int,您的检查失败的原因是,在 c# 中,每个 enum是自己的类型,继承自System.Enum . IE。如果你这样做

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'"

如果你box首先枚举和 int 值(这是将它们传递给 RequiredIfAttribute 的构造函数时发生的情况)然后没有编译器错误但是 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;
}

关于c# - 将万无一失的 RequiredIf 与枚举一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27283689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com