使用类型检查C#更好的If语句

acc*_*777 4 .net c# if-statement

我目前正在开发.NET 4.7.1应用程序。我有一个If语句来检查数据类型并相应地调用处理程序方法。

我当前的If语句如下所示:

// object msg = MyHelper.Deserialize(xmlString);

if (msg is Tomato) Handle_Tomato((Tomato)msg);
if (msg is Apple) Handle_Apple((Apple)msg);
if (msg is Banana) Handle_Banana((Banana)msg);
if (msg is Orange) Handle_Orange((Orange)msg);
Run Code Online (Sandbox Code Playgroud)

味精基本上是从字符串反序列化的对象。

我想知道,是否有更好的方式编写if语句?

非常感谢你!

AAA*_*ddd 8

正如Sweeper在评论中提到的那样,从C#7.0开始,您可以使用The is type模式表达式

if (msg is Tomato tomato) Handle_Tomato(tomato);
Run Code Online (Sandbox Code Playgroud)

C#7.0开始,您还可以将模式匹配与switch语句(类型模式)一起使用

类型模式可以进行简洁的类型评估和转换。与switch语句一起执行模式匹配时,它将测试表达式是否可以转换为指定的类型,如果可以,则将其强制转换为该类型的变量。

switch(msg)
{
   case Tomato tomato : Handle_Tomato(tomato); break;
   case Apple apple : Handle_Apple(apple); break;
   ...
}
Run Code Online (Sandbox Code Playgroud)


Sha*_*awn 5

我强烈建议不要做这样的检查。如果将来有几十种不同的类型怎么办?您的 if 语句会增加并且无法维护。如果类型发生变化怎么办?您还必须更改所有 if 语句。

您可以通过使用接口来解决此问题。你已经有课程了。

interface IHandler
{
    void Execute();
} 
Run Code Online (Sandbox Code Playgroud)
class Orange : IHandler 
{
    public void Execute()
    {
        // do your orange stuff 
    }
}
Run Code Online (Sandbox Code Playgroud)
class Tomato : IHandler
{
    public void Execute()
    {
        // do your tomato stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

可以这样称呼。

if (msg is IHandler) ((IHandler)msg).Execute();
Run Code Online (Sandbox Code Playgroud)