簡體   English   中英

我想知道是否或如何使用標志枚舉並在另一個類中返回枚舉參數

[英]I want to know if or how I can use the flag enum and return the enum parameter in another class

我有一個用於輸入驗證的標志枚舉的列表,我想返回其中一個枚舉作為驗證的一部分。 到目前為止,這是我想出的...
這些是我的枚舉。

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

我實際上最終放棄了這個想法,並使用了“錯誤報告”。 我無法完全采用這種方法為我工作。 絕對是由於我缺乏專業知識。 有一天,我希望能解決我遇到的問題。

進行以下更改可以解決該問題。 但是您有一些設計問題。 您需要仔細考慮如何產生錯誤並做出響應。

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

或者這樣:

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

一個[flags]枚舉應該具有2的冪,因此您可以將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為NOT CheckInput.OK的情況下,可以從驗證方法中調用以獲取錯誤消息:

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

或類似的規定。

文檔中,您可以找到:

枚舉的批准類型為byte,sbyte,short,ushort,int,uint,long或ulong。

並進一步:

要從枚舉類型轉換為整數類型,必須進行顯式轉換。 例如,以下語句通過使用強制轉換將枚舉數Sun枚舉轉換為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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM