[英]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.