2017-01-06 2 views

ответ

1

Вы можете сделать следующее:

public static bool IsDefinedInEnum(this Enum value, Type enumType) 
{ 
    if (value.GetType() != enumType) 
     return false; 

    return Enum.IsDefined(enumType, value); 
} 

код может использовать какое-то объяснение:

  • Первую проверку просто убедитесь, что значение перечисления и тип перечисления одинаковы. Если это не так, метод должен вернуться, очевидно, false. Но почему это необходимо? Enum.IsDefined покроет это тоже, верно?

    В идеале, мы бы хотели, чтобы у меня был следующий будильник: IsDefinedIn<T>(this T value) where T: Enum. Это было бы совершенно безопасно во время компиляции, но, к сожалению, ограничение T: Enum недействительно. Это означает, что enumType может быть любым, как typeof(object), нет механизма в языке для ограничения enumType только для перечисления типов. Это может сделать бросок Enum.IsDefined, если вы этого не хотите, вы должны сохранить первую проверку.

    Учтите, что вы должны throw (или assert), если передать какой-либо тип, который не является Enum, является ошибкой в ​​вашем коде. Я только что показал вам, как можно обойти эту проблему, если это необходимо.

  • Вторая проверка просто гарантирует, что значение определено в перечислении. SomeEnumeration.SomeValue вернет true и (SomeEnumeration)5 вернет false, если только нет члена перечисления с этим значением.

0

Я задал себе одно и то же, затем я нашел его и нашел здесь свой вопрос. Это очень не помогло. Однако это заставило меня взглянуть на исходные и юнит-тесты на github, поэтому спасибо за это. https://github.com/JeremySkinner/FluentValidation/blob/master/src/FluentValidation.Tests/EnumValidatorTests.cs

Я помещаю это здесь для следующего человека, который приходит вместе с тем же вопросом. Вам не нужно предоставлять какую-либо реализацию функции IsInEnum(). Эта функция использует отражение для определения типа Enum свойства, указанного в вашем правиле, а затем проверяет значение этого свойства на основе допустимых значений Enum.

Смежные вопросы