Использование Foolproof Required если Enum
Мы пытаемся использовать проверочную аннотацию Foolproof [RequiredIf]
проверить, нужен ли адрес электронной почты. Мы также создали перечисление, чтобы избежать использования идентификатора таблицы поиска во ViewModel. Код выглядит так:
public enum NotificationMethods {
Email = 1,
Fax = 2
}
Затем в ViewModel:
[RequiredIf("NotificationMethodID", NotificationMethods.Email)]
public string email {get; set;}
В этом senario мы не получаем ошибку, когда электронное письмо не заполнено, но выбрано в качестве типа уведомления. И наоборот, это работает как ожидалось:
[RequiredIf("NotificationMethodID", 1)]
public string email {get; set;}
Единственное другое упоминание об этом я нашел здесь: https://foolproof.codeplex.com/workitem/17245
1 ответ
Учитывая, что ваш метод NotificationMethodID
возвращает int
причина, по которой ваша проверка терпит неудачу, в том, что в C# каждый enum
это его собственный тип, наследующий от System.Enum
, Т.е. если вы делаете
var value = NotificationMethods.Email;
string s = value.GetType().Name;
Ты увидишь s
имеет значение "NotificationMethods"
не "Int32"
,
Если вы попытаетесь проверить равенство int напрямую с перечислением, вы получите ошибку компилятора:
var same = (1 == NotificationMethods.Email); // Gives the compiler error "Operator '==' cannot be applied to operands of type 'int' and 'NotificationMethods'"
Если вы сначала укажете значения enum и 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;
}