我可以在c#中动态检查交换机的case语句吗?

时间:2016-06-06 20:42:14

标签: c# asp.net switch-statement

今天我遇到了一个问题:我试图检查软件的错误,以便在错误发生时提供程序的正确行为。

我必须检查数据库中是否已存在用户。

问题是后端没有提供errorId所以我必须通过文本检查错误。

错误显示如下:

  

用户名称已存在!

Switch语句是这样的:

switch (error.text)
{ 
  case "User Test already exists":
    Console.WriteLine("The user already Exists"); //this is a test behaviour. 
    break;
  default:
    Console.WriteLine("I couldn't behave in any way :<");
}

正如您可以想象的那样,名称都是不同的(它是数据库中的唯一字段),因此单词&#34;测试&#34;在case语句中应该是用户的名字。

我可以动态更改字符串吗?

4 个答案:

答案 0 :(得分:1)

看起来像正则表达式会做的伎俩。我根据模式构建了这个正则表达式:

The user Name already Exists!

其中Name可以是任何值。正则表达式是:

(the user .* already exists)

要使用它,你会做这样的事情:

Regex.IsMatch(error.text, "(the user .* already exists)", RegexOptions.IgnoreCase)

根据匹配,会返回truefalse。现在,这不能在交换机中完成,但您可以通过多个Regexes运行该值以确定它匹配的值。您可以考虑的一件事是扩展方法。考虑一下这个:

public static class RegexExtensions
{
    private static readonly Regex UserNameAlreadyExists = new Regex("(the user .* already exists)", RegexOptions.IgnoreCase | RegexOptions.Compiled);

    public static bool IsUserNameAlreadyExists(this string inputValue)
    {
        return UserNameAlreadyExists.IsMatch(inputValue);
    }
}

这个用法非常好:

if (error.text.IsUserNameAlreadyExists())
{
    // do something
}

扩展方法是一种非常好的方法。它是完全封装的,可以保持使用非常干净。此外,在一个地方定义正则表达式更容易,因此将其设置为Compiled使其更快。

答案 1 :(得分:0)

最好更改后端或更改它(它肯定应该返回某种错误代码而不是显然意味着向用户显示的已经本地化的消息 - 这显然是一个前端任务)。

要回答这个问题,不要;考虑使用类似的东西(原始措辞,请注意这些字符串比较区分大小写):

if(error.text.StartsWith("User ") && error.text.EndsWith(" already Exists"))
{ 
    Console.WriteLine("The user already Exists"); //this is a test behaviour. 
}
else
{
    Console.WriteLine("I couldn't behave in any way :<");
}

答案 2 :(得分:0)

我认为这是一个相当简单的解决方案:

class Program
{

    int errorIndex = 5; //Based on error expected text. Can add more criteria here.

    private static bool testResponse = false;

    static void Main(string[] args)
    {
        string text = "The user already exists";


        getErrorMessage(text);

    }


    private static void getErrorMessage(string message)
    {

        var user = message.Substring(4, 4);
        var exists = message.Substring(17, 6);
        if (user == "user" && exists == "exists")
            //Write the error message.
            Console.WriteLine(message.ToString());
            var errorMessage = message;
            if (errorMessage != null)
            {
                testResponse = true;
            }
            Console.ReadLine();



    }
}

如果您知道错误消息的某些单词的长度和索引的确切位置。您可以使用该信息进一步缩小预期的错误。这假设没有errorId。

答案 3 :(得分:-1)

只是为了确定:后端没有提供任何errorID?如果您使用C#进行数据库连接(即ADO.Net),则可以进行有效的错误处理。

是否可以检查error.text是否为空?

if(error.text=="")Console.WriteLine("The User already exists");
else Console.WriteLine("I couldn't behave in any way");

如果要检查“user”列中是否有重复项,可以直接通过SQL检查数据库。