C # Как проверить, что значение перечисления передается в параметре? - PullRequest
0 голосов
/ 22 ноября 2010

У меня есть метод, который принимает перечисление в качестве аргумента:

[Flags]
public enum MyEnum
{
  A = 1,
  B = 2,
  C = 3
}

public class MyClass
{
  public MyEnum myEnum;
}

public bool MyMethod(MyClass class, MyEnum enumParam)
{
  // Here I want to check if object class contains some enum values passed as an argument
  // Something like: if(class.myEnum 'contains-one-of-the-items-of enumParam)
}

public void Test()
{
  Myclass class = new MyClass() { myEnum = MyEnum.A };
  MyMethod(class, MyEnum.A | MyEnum.B);
}

Я хочу проверить, содержит ли объект одно из значений перечисления, переданных в метод в качестве аргумента.

Ответы [ 5 ]

3 голосов
/ 22 ноября 2010

Поскольку вы используете флаги, это может помочь вам проверить, установлено ли значение перечисления: Что означает атрибут перечисления [Flags] в C #?

2 голосов
/ 22 ноября 2010

Вы можете написать это следующим образом:

public bool MyMethod(MyClass class, MyEnum enumParam)
{
  if( (enumParam & MyEnum.A) != 0 ){
    ...
  }
  if( (enumParam & MyEnum.B) != 0 ){
    ...
  }
}

Я изменил enum на enumParam, чтобы не конфликтовать с ключевым словом enum.

Существует также проблема с вашимреализация, так как у вас есть значения 1,2,3 для A, B, C.Таким образом, вы не можете различить A + B = 3 и C = 3.A должно быть 1, B должно быть 2 и C должно быть 4 (D должно быть 8 и т. Д.)

РЕДАКТИРОВАТЬ

Редактировать из-за комментария OP.

public bool MyMethod(MyClass class, MyEnum enumParam)
{
  return Enum.IsDefined(typeof(MyEnum), enumParam);
}
1 голос
/ 22 ноября 2010

Измените свой enum следующим образом:

public enum MyEnum
    {
        A = 2,
        B = 4,
        C = 8
    }

и ваш метод прост:

public bool MyMethod(MyClass aClass, MyEnum aEnum)
        {
            return (aClass.myEnum & aEnum) != 0;
        }

С наилучшими пожеланиями

1 голос
/ 22 ноября 2010

Если вы хотите увидеть, находятся ли любые значений, переданных в параметре, в поле myEnum класса, вы можете написать:

public bool MyMethod(MyClass class, MyEnum enum)
{
  // Here I want to check if object class contains some enum values passed as an argument
  // Something like: if(class.myEnum 'contains-one-of-the-items-of enum)
  return (this.myEnum & enum) != 0;
}

Это делает логическое «И» битовых флагов и возвращает true, если какой-либо из флагов в enum установлен в myEnum.

Если вы хотите убедиться, что все флаги установлены, вы можете написать:

return (this.myEnum & enum) == this.myEnum;

Кроме того, внимательно прочитайте ответ @ Øyvind Bråthen. Чтобы [Flags] работал, вам нужно убедиться, что ваши значения перечисления имеют степени 2.

0 голосов
/ 22 ноября 2010

В C # 4.0 вы можете легко использовать Enum.HasFlag метод.Вы можете взглянуть на этот вопрос , чтобы получить другие решения, включая C # 3.5 и предыдущие версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...