0

入力検証用のフラグ列挙型のリストがあり、検証の一部として列挙型の 1 つを返したいと考えています。これまでのところ、これが私が思いついたものです...
これらは私の列挙型です。

[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

列挙型[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();
}

statusNOTの場合にエラーメッセージを取得するために検証メソッドから呼び出すものCheckInput.OK:

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

または、それらの線に沿った何か。

于 2016-05-09T13:11:51.377 に答える
0

次の変更により、問題が解決するはずです。しかし、いくつかの設計上の問題があります。エラーを生成して対応する方法を慎重に検討する必要があります。

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

またはこの方法:

public void ValidInputSwitch(CheckInput status)
{
    do
    {
        switch (status)
        {
于 2016-05-09T12:56:36.547 に答える
0

ドキュメントには次のものがあります。

列挙型として承認されている型は、byte、sbyte、short、ushort、int、uint、long、または ulong です。

そしてもう少し:

列挙型から整数型に変換するには、明示的なキャストが必要です。たとえば、次のステートメントは、キャストを使用して enum から int に変換することにより、列挙子 Sun を 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 に答える