我想知道是否或如何使用标志枚举并在另一个类中返回枚举参数

时间:2016-05-09 12:47:44

标签: c# enums enum-flags

我有一个用于输入验证的标志枚举列表,我想返回其中一个枚举作为验证的一部分。到目前为止,这是我想出来的......
这些是我的枚举。

[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;错误报告"。我无法让这种方法为我工作。绝对是由于我不知道如何。有一天,我希望能解决我遇到的问题。

3 个答案:

答案 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);
    }
}