2016-05-09 3 views
0

У меня есть список флагов для проверки ввода, я хочу вернуть одно из перечислений в качестве части моей проверки. Пока это то, что я придумал ...
Это мои перечисления.Я хочу знать, могу ли я использовать флаг перечисления и возвращать параметр перечисления в другом классе

[Flags] 
public enum CheckInput 
{ 
    Not_Valid, 
    OK, 
    No_First_Name, 
    No_Last_Name, 
    No_Password, 
    Wrong_Password 
}; 

Это мой переключатель, чтобы показать сообщение для когда перечисление используется

public void ValidInputSwitch() 
{ 
    CheckInput Status = CheckInput.Not_Valid; 
    do 
    { 
     switch (Status) 
     { 
      case CheckInput.No_First_Name: 
       MessageBox.Show("Please enter your first name."); 
       break; 
      case CheckInput.No_Last_Name: 
       MessageBox.Show("Please enter your last name."); 
       break; 
      case CheckInput.No_Password: 
       MessageBox.Show("Please enter your password."); 
       break; 
      case CheckInput.Wrong_Password: 
       MessageBox.Show("Your passwords do not match!"); 
       break; 
      case CheckInput.OK: 
       CheckUserName(Uname); 
       break; 
      default: 
       break; 
     } 
    } 
    while (Status != CheckInput.OK); 
} 

Вот где моя проблема заключается, я хочу, чтобы подтвердить ввод и ВОЗВРАЩАЙТЕ перечисление, так что она может работать с мой переключатель и показать сообщение, которое там

public CheckInput InputCheck 
{ 
    { 
     if (firstNameTxt.Text == null || firstNameTxt.Text == "") { return CheckInput.No_First_Name; } 
    } 
} 

я фактически отказался от этой идеи, в конце концов, и используется «Отчеты об ошибках». Я не мог заставить этот метод работать для меня. Определенно из-за моей нехватки знаний. Однажды я надеюсь, что решит проблему, которая у меня была.

+1

'Status = InputCheck();', просто добавьте его после включения и до в то время как. – Gusman

+0

Не тот же вопрос, но хороший ответ с хорошим примером http://stackoverflow.com/questions/8447/what-does-the-flags-enum-attribute-mean-in-c –

+0

В качестве отдельного аспекта рассмотрим использование сопоставления как «Словарь » для сопоставления значений перечисления вызовам методов вместо коммутатора –

ответ

0

Следующие изменения должны решить проблему. Но у вас есть проблемы с дизайном. Вам нужно тщательно подумать, как создавать ошибки и отвечать.

public void ValidInputSwitch() 
{ 
    CheckInput Status = InputCheck; 
    do 
    { 

или таким образом:

public void ValidInputSwitch(CheckInput status) 
{ 
    do 
    { 
     switch (status) 
     { 
0

[flags] перечисление должен иметь полномочия-оф-двух значений, так что вы можете ИЛИ значения вместе и проверить их с AND.

Я предлагаю вам изменить ваше перечисление следующим образом:

[Flags] 
public enum CheckInput 
{ 
    OK    = 0, 
    No_First_Name = 1, 
    No_Last_Name = 2, 
    No_Password = 4, 
    Wrong_Password = 8 
} 

Тогда вы могли бы написать ValidateInput() что-то вроде этого:

public static CheckInput ValidateInput(string firstName, string lastName, string password) 
{ 
    CheckInput result = CheckInput.OK; 

    if (string.IsNullOrWhiteSpace(firstName)) 
     result |= CheckInput.No_First_Name; 

    if (string.IsNullOrWhiteSpace(lastName)) 
     result |= CheckInput.No_Last_Name; 

    if (string.IsNullOrEmpty(password)) 
     result |= CheckInput.No_Password; 
    else if (!PasswordIsValid(password)) 
     result |= CheckInput.Wrong_Password; 

    return result; 
} 

И, таким образом, вы можете создать сообщение об ошибке с ненулевым status like so:

public static string CreateErrorMessage(CheckInput status) 
{ 
    StringBuilder result = new StringBuilder("Please correct the following issues:\n"); 

    if ((status & CheckInput.No_First_Name) != 0) 
     result.AppendLine("Missing first name."); 

    if ((status & CheckInput.No_Last_Name) != 0) 
     result.AppendLine("Missing last name."); 

    if ((status & CheckInput.No_Password) != 0) 
     result.AppendLine("Missing password."); 

    if ((status & CheckInput.Wrong_Password) != 0) 
     result.AppendLine("Invalid password"); 

    return result.ToString(); 
} 

которые вы вызываете из своего метода проверки получить сообщение об ошибке в том случае, status НЕ CheckInput.OK:

... 
if (status != CheckInput.OK) 
{ 
    MessageBox.Show(CreateErrorMessage(status)); 
} 
else 
{ 
    ... it's ok. 

Или что-то вдоль этих линий.

+0

Это буквально то, что я хотел сделать, я заменил «(! PasswordIsValid (password))« ect с помощью «GetValue.password.Text» через новый объект, чтобы он действительно смотрел на ввод пользователя. (Я работаю довольно медленно, обновляю сообщения об ошибках и обновляю свой ответ). благодаря –

0

В documentation вы можете найти:

Утвержденные типы для перечисления являются байт, SByte, короткие, UShort, INT, UINT, длинные или ULong.

И немного дальше:

явное приведение необходимо преобразовать из перечислимого типа в качестве интегрального типа. Например, следующий оператор присваивает перечислителю Sun переменной типа int, используя приведение для преобразования из enum в int.

Итак, если вы хотите, чтобы ваш метод возвращал ваше перечисление, он должен быть преобразован в int (или другой поддерживаемый тип, если вы не используете его по умолчанию). Кроме того, ваш результат должен быть затем перенесен из int обратно в тип перечисления, чтобы получить значение перечисления. Я скорректировал ваш код, чтобы применить это, чтобы вы могли видеть идею. (Так как я использую консольное приложение все это преобразуется в статический и отображаются сообщения на консоль, а также.)

class Program 
{ 
    static void Main(string[] args) 
    { 
     var res = InputCheck("Piotr", "Wolkowski"); 
     ValidInputSwitch((CheckInput)res); 
     Console.ReadLine(); 
    } 

    public static int InputCheck(string firstName, string lastName) 
    { 
     if (string.IsNullOrEmpty(firstName)) 
     { 
      return (int)CheckInput.No_First_Name; 
     } 

     return (int)CheckInput.OK; 
    } 

    public static void ValidInputSwitch(CheckInput status) 
    { 
     do 
     { 
      switch (status) 
      { 
       case CheckInput.No_First_Name: 
        Console.WriteLine("Please enter your first name."); 
        break; 
       case CheckInput.No_Last_Name: 
        Console.WriteLine("Please enter your last name."); 
        break; 
       case CheckInput.No_Password: 
        Console.WriteLine("Please enter your password."); 
        break; 
       case CheckInput.Wrong_Password: 
        Console.WriteLine("Your passwords do not match!"); 
        break; 
       case CheckInput.OK: 
        Console.WriteLine("OK"); 
        break; 
       default: 
        break; 
      } 
     } 
     while (status != CheckInput.OK); 
    } 
} 

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

  • Нет связанных вопросов^_^