如何判断SuperClass实例具体是SubClass1还是SubClass2专属实例?
解决方案
针对你的需求,分两种场景给出实现方式:
场景1:判断参数是SubClass1的实例(包含其子类),但不是SubClass2的实例
如果允许arg是SubClass1的子类实例,仅需要排除SubClass2及其子类的情况,直接用C#类型检查语法即可:
public void DoStuff(SuperClass arg) { if (arg is SubClass1 && arg is not SubClass2) { var data = (SubClass1)arg; // 执行操作 } }
如果使用C# 9.0之前的版本,不支持is not语法,可以用逻辑非代替:
if (arg is SubClass1 && !(arg is SubClass2))
场景2:判断参数的实际类型恰好是SubClass1(不包含其子类)
如果需要严格判断arg的类型就是SubClass1本身,而非它的任何子类,通过GetType()和typeof()对比实现:
public void DoStuff(SuperClass arg) { if (arg.GetType() == typeof(SubClass1)) { var data = (SubClass1)arg; // 执行操作 } }
同理,判断仅为SubClass2实例的代码为:
if (arg.GetType() == typeof(SubClass2)) { var data = (SubClass2)arg; // 执行对应操作 }
补充说明
is关键字会检查实例是否是指定类型或其派生类型的实例GetType()返回对象的实际运行时类型,typeof()返回指定类型的Type对象,两者对比可实现严格的类型匹配- 当前代码中SubClass1和SubClass2无继承关系,判断
arg is SubClass1时自然不会是SubClass2的实例,但保留&& arg is not SubClass2能应对未来类结构变化的情况,更严谨。
内容的提问来源于stack exchange,提问作者acmoune
相关产品推荐
相关产品推荐

