Использование 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;
}
Другие вопросы по тегам