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; }
    }
}

我实际上最终放弃了这个想法并使用了“错误报告”。我不能完全让这种方法为我工作。肯定是因为我不知道怎么做。有一天,我希望能解决我遇到的问题。

4

3 回答 3

0

文档中,您可以找到:

已批准的枚举类型为 byte、sbyte、short、ushort、int、uint、long 或 ulong。

更进一步:

从枚举类型转换为整数类型需要显式强制转换。例如,以下语句将枚举器 Sun 分配给 int 类型的变量,方法是使用强制转换从 enum 转换为 int。

因此,如果您希望您的方法返回您的枚举,则必须将其强制转换为 int(或其他受支持的类型,如果您不使用默认类型)。此外,您的结果必须从 int 转换回 enum 类型以获取 enum 值。我调整了您的代码以应用它,以便您可以看到背后的想法。(由于我使用的是控制台应用程序,因此它全部转换为静态,并且消息也显示到控制台。)

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);
    }
}
于 2016-05-15T16:44:52.153 回答
0

以下更改应该可以解决问题。但是你有一些设计问题。您需要仔细考虑如何产生错误并做出响应。

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

或者这样:

public void ValidInputSwitch(CheckInput status)
{
    do
    {
        switch (status)
        {
于 2016-05-09T12:56:36.547 回答
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;
}

因此,您可以从非零状态创建错误消息,如下所示:

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在NOT的情况下,您从验证方法调用它以获取错误消息CheckInput.OK

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

或类似的规定。

于 2016-05-09T13:11:51.377 回答