首页 > 解决方案 > 检查对象是否属于某种类型的更好方法是使用它作为所说的类型?

问题描述

我有一个巨大的 if else 语句,其中一个对象正在检查特定类型,因为它在方法中使用。有没有更短/更有效的方法来做到这一点?

稍微简化一下我的代码如下所示:

if(object is class1) someMethod(object as class1);
else if (object is class2) someMethod(object as class2);
else if (object is class3) someMethod(object as class3);
else if (object is class4) someMethod(object as class4);
else if (object is class5) someMethod(object as class5);
.
.
.

标签: c#objectif-statementcasting

解决方案


C# 7.0 允许您将其编写为 switch 语句:

switch (object)
{
    case Class1 c1:
        someMethod(c1);
        break;
    case Class2 c2:
        someMethod(c2);
        break;
}

或者,您可以在 C# 7.0 中使用模式匹配:

if (object is Class1 c1) someMethod(c1);
else if (object is Class2 c2) someMethod(c2);

如果你可以改变 Class1/Class2/etc 来实现一些访问者接口,你可以使用访问者模式/双重调度:

public interface IClass
{
     void Visit(IClassVisitor visitor);
}

public interface IClassVisitor
{
    void Accept(Class1 c1);
    void Accept(Class2 c2);
}

public class Class1 : IClass
{
    public void Visit(IClassVisitor visitor) => visitor.Accept(this);
}

public class Class2 : IClass
{
    public void Visit(IClassVisitor visitor) => visitor.Accept(this);
}

然后实现IClassVisitor(并实现Accept(Class1 c1)and Accept(Class2 c2)),并调用:

object.Visit(this);

Accept并且将调用正确的重载。

(我特别喜欢访问者模式,原因很简单:如果您添加另一个实现IClass,编译器会强制您更新每个访问者,因此您不会忘记编写一些代码来处理新的实现。使用 switch 语句/if/else,你必须记住所有你切换的地方object并更新它们。这样,感觉不像是违反了开/关原则)。


推荐阅读