2015-02-16 4 views
0

Я видел где-то (больше не могу найти), чтобы вы могли проверить наличие значения перечисления из элемента перечисления с определенным списком элементов. Ex. ниже - «Доступно = doc | xls | csv»C# Enum validate from list of values ​​

Но следующий код не работает. Я ожидаю, что результаты будут равны = xls вместо doc, так как они находятся в списке значений «Доступные».

Может кто-нибудь помочь?

Заранее благодарен!

Niki

Кнопка Код:

protected void btnTest01_Click(object sender, EventArgs e) 
{ 
    TestEnum01 result1 = TestEnum01.xls; 
    TestEnum02 result2 = TestEnum02.xls; 
    TestEnum03 result3 = TestEnum03.xls; 

    if (result1 != TestEnum01.Available) 
    { 
     result1 = TestEnum01.doc; 
    } 

    if (result2 != TestEnum02.Available) 
    { 
     result2 = TestEnum02.doc; 
    } 

    if (result3 != TestEnum03.Available) 
    { 
     result3 = TestEnum03.doc; 
    } 

    this.txtTest01_Results.Text = 
     String.Format("01: Result = {0}, Available = {1}\r\n\r\n02: Result = {2}, Available = {3}\r\n\r\n03: Result = {4}, Available = {5}", 
     result1.ToString(), TestEnum01.Available, 
     result2.ToString(), TestEnum02.Available, 
     result3.ToString(), TestEnum03.Available); 
    } 

Перечисления

public enum TestEnum01 
{ 
    doc = 1, 
    txt = 2, 
    xls = 4, 
    csv = 8, 
    unknown = 5, 
    Available = doc | xls | csv 
} 

public enum TestEnum02 
{ 
    doc, 
    txt, 
    xls, 
    csv, 
    unknown, 
    Available = doc | xls | csv 
} 

public enum TestEnum03 
{ 
    doc, 
    txt, 
    xls, 
    csv, 
    unknown, 
    Available = TestEnum03.doc | TestEnum03.xls | TestEnum03.csv 
} 

РЕЗУЛЬТАТЫ:

01: Result = doc, Available = Available 
02: Result = doc, Available = csv 
03: Result = doc, Available = csv 
+0

Непонятно, в чем ваш вопрос. Не могли бы вы объяснить это лучше? Также эти 3 перечисления запутывают. Они показывают ваши попытки или ...? –

+0

Мой вопрос: могу ли я проверить элемент перечисления, если он существует, используя другой элемент перечисления со списком значений. В приведенном выше примере я проверяю ifof TestEnum01.xls в списке значений в TestEnum01.Available. Но «if (result1! = TestEnum01.Available)», похоже, не работает. –

+1

Использовать метод HasFlag 'if (result.HasFlag (TestEnum01.xls))' и получить хорошее преобразование «ToString», использовать 'FlagsAttribute' –

ответ

3

Вы должны использовать FlagsAttribute:

[Flags] 
public enum TestEnum01 
{ 
    doc = 1, 
    txt = 2, 
    xls = 4, 
    csv = 8, 
    unknown = 5, 
    Available = doc | xls | csv 
} 

Затем проверить:

TestEnum01 test = TestEnum01.doc | TestEnum01.txt; 
bool isDoc = (test & TestEnum01.doc) == TestEnum01.doc; 

Обратите внимание, что в вашем примере, вы будете иметь проблемы с unknown значение, так как двоичный мудр, 1 | 4 = 5 ... А это означает, что документ и XLS производит неизвестно ... Для того, чтобы избежать такого рода проблем, я предпочитаю использовать прямое обозначение битового сдвига:

[Flags] 
public enum TestEnum01 
{ 
    unknown = 0, 
    doc = 1 << 0, 
    txt = 1 << 1, 
    xls = 1 << 2, 
    csv = 1 << 3, 
    Available = doc | xls | csv 
} 

Если вы просто хотите проверить для конкретный флаг, вы можете просто использовать метод HasFlag()

TestEnum01 test = TestEnum01.doc | TestEnum01.txt; 
bool isDoc = test.HasFlag(TestEnum01.doc); 
+0

Sharped, как я могу использовать эту логику для проверки того, проходит ли значение, которое я передаю (например, TestEnum01.xls), в TestEnum01.Available? –

+0

просто используйте строку bool isDoc = ... или HasFlag() – rducom

+0

Спасибо. Я использовал HasFlag для значения по умолчанию для doc, если перечисление неизвестно или нет в списке доступных значений. "if (! TestEnum01.Available.HasFlag (input) || (input == TestEnum01.unknown))" где input = TestEnum01.xls например. –