C#中如何在未知对象具体类型时修改其子类成员?
解决子类属性访问问题
代码错误原因
你代码里的几个错误本质是类型转换的语法或逻辑问题:
(Deer)pet.horn_length++犯了运算符优先级错误:.比强制转换优先级高,代码会先尝试访问pet.horn_length(但Animal类没有这个属性),自然报错。- 直接写
Deer Jack = (Deer)pet;没有先判断类型,一旦pet不是Deer实例,会直接抛出InvalidCastException。 (pet as Deer).horn_length++没考虑as转换失败返回null的情况,直接访问属性会触发NullReferenceException。
正确实现方式
1. C# 7+ 模式匹配(最推荐)
用is关键字在判断类型的同时完成转换,代码简洁且安全:
void function(Animal pet) { if (pet is Deer deer) { deer.horn_length++; } if (pet is Giraffe giraffe) { giraffe.neck_length++; } }
2. 先判断再显式转换
确认类型后,先把pet转成子类实例再访问属性:
void function(Animal pet) { if (pet is Deer) { Deer deer = (Deer)pet; deer.horn_length++; } if (pet is Giraffe) { Giraffe giraffe = (Giraffe)pet; giraffe.neck_length++; } }
3. 使用as关键字并判空
as转换失败不会抛异常,只会返回null,所以必须先检查是否为null:
void function(Animal pet) { Deer deer = pet as Deer; if (deer != null) { deer.horn_length++; } Giraffe giraffe = pet as Giraffe; if (giraffe != null) { giraffe.neck_length++; } }
4. 面向对象进阶:多态实现
如果你的操作是每个子类的专属行为,推荐用多态避免类型判断,更符合OOP设计:
public class Animal { public int age; // 定义虚方法,子类重写 public virtual void UpdateUniqueFeature() { } } public class Deer : Animal { public int horn_length; public override void UpdateUniqueFeature() { horn_length++; } } public class Giraffe : Animal { public int neck_length; public override void UpdateUniqueFeature() { neck_length++; } } void function(Animal pet) { // 直接调用,自动匹配子类实现 pet.UpdateUniqueFeature(); }
内容的提问来源于stack exchange,提问作者Ebrahim Mehri
相关产品推荐
相关产品推荐

