C#中基类类型参数如何调用派生类独有的方法
问题原因
is运算符仅会返回类型是否匹配的布尔结果,不会修改变量的编译时类型,因此判断后b仍然被识别为Base类,自然无法调用仅Derivative类存在的foo方法。
可用解决方案
所有方案都不会拷贝原对象,完全保留原引用的指向,修改转换后变量的属性会同步到原实例。
1. 模式匹配(推荐,C# 7.0+支持)
在is判断时直接声明转换后的目标类型变量,匹配成功会自动完成赋值:
void Action (Base b) { if (b is Derivative derivative) { derivative.foo(); } }
2. 显式强制转换(兼容旧版本C#)
类型判断通过后,强制把Base类型变量转换为Derivative类型再调用方法:
void Action (Base b) { if (b is Derivative) { // 单次调用可以直接转完调用 ((Derivative)b).foo(); // 需要多次调用可以先存为局部变量 // Derivative d = (Derivative)b; // d.foo(); } }
3. as运算符转换
先用as尝试做类型转换,转换失败会返回null,判断非空后即可调用方法:
void Action (Base b) { Derivative d = b as Derivative; if (d != null) { d.foo(); } }
内容的提问来源于stack exchange,提问作者Lae
相关产品推荐
相关产品推荐

