更好的方法来检查对象是否属于某种类型,而将其用作所述类型?

时间:2019-04-04 08:48:21

标签: c# object if-statement casting

我有一条很大的if语句,其中Object正在检查特定类型,但在方法中使用了它。有更短/更有效的方法吗?

有点简化,我的代码如下:

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);
.
.
.

1 个答案:

答案 0 :(得分:3)

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)Accept(Class2 c2)),并调用:

object.Visit(this);

,将调用Accept的右重载。

(我是访客模式的特别拥护者,出于一个简单的原因:如果您添加IClass的另一种实现,则编译器会强制您更新每个访客,因此您没有机会忘记编写一些处理新实现的代码。使用switch语句/ if / else,您必须记住切换object并更新每个位置的所有位置。更少违反开放/封闭原则。