You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 16:55:56