c# - 检查对象是否属于某种类型的更好方法是使用它作为所说的类型?
问题描述
我有一个巨大的 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# 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
并更新它们。这样,感觉不像是违反了开/关原则)。
推荐阅读
- django - 以整数形式获取 CharField 的值
- windows - Torch 未使用启用 CUDA 的 Windows 10 编译
- angular - 私有 http:HttpClient 进出构造函数?
- python - 如何聚合多个多边形opencv
- python - How to get the start and end date period of a data sequence in python?
- redux - 如何在“待定”状态下在“createAsyncThunk”上发送自定义参数?
- html - 嵌入图标字体作为 base64 的问题
- jenkins - 带有 Browserstack 的 Testcafe 在中间停止运行测试
- html - 缓存坏了?无法在移动 WORDPRESS 上加载 css
- asp.net-mvc-5 - 如何使用 Godaddy plesk 处理 MVC 应用程序托管的 Http 403.14 错误