我有一个用于输入验证的标志枚举列表,我想返回其中一个枚举作为验证的一部分。到目前为止,这是我想出来的......
这些是我的枚举。
[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; }
}
}
我最终放弃了这个想法并使用了#34;错误报告"。我无法让这种方法为我工作。绝对是由于我不知道如何。有一天,我希望能解决我遇到的问题。
答案 0 :(得分:0)
以下更改应解决问题。但是你有一些设计问题。您需要仔细考虑如何生成错误并做出响应。
public void ValidInputSwitch()
{
CheckInput Status = InputCheck;
do
{
或者这样:
public void ValidInputSwitch(CheckInput status)
{
do
{
switch (status)
{
答案 1 :(得分:0)
[flags]
枚举应该具有两个幂的值,因此您可以将OR值组合在一起并使用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;
}
因此您可以从非零状态创建错误消息,如下所示:
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.
或类似的东西。
答案 2 :(得分:0)
在documentation中,您可以找到:
枚举的已批准类型是byte,sbyte,short,ushort,int,uint,long或ulong。
更进一步:
从枚举类型转换为整数类型需要显式强制转换。例如,以下语句通过使用强制转换将enum转换为int,将枚举器Sun赋给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);
}
}