我有一条很大的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);
.
.
.
答案 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
并更新每个位置的所有位置。更少违反开放/封闭原则。