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

Unity C#:从基类变量访问子类属性报错求助

解决XML解析器中的ActionConfig属性访问错误

嘿,这个问题我之前做游戏配置解析的时候也碰到过!咱们先搞清楚错误的根源:

你声明的config变量类型是基类ActionConfig,虽然在运行时它会被赋值为子类FireActionConfig的实例,但编译器在编译阶段只把它当作ActionConfig处理——而ActionConfig里并没有定义speed属性,自然就会抛出这个错误了。

下面给你几种实用的解决方法,按需选择就行:

方法1:先实例化子类并赋值属性,再转给基类变量

这种写法最直观,先创建子类实例,把专属属性赋值完,再赋值给基类的config变量:

foreach (XmlNode node in actionList) {
    ActionConfig config;
    if (/* 这里写判定动作是"Fire"的逻辑 */) {
        // 先创建子类实例
        var fireConfig = new FireActionConfig();
        // 直接访问子类的speed属性,编译器完全认可
        fireConfig.speed = (float)node.Attributes["speed"].Value;
        // 再赋值给基类变量
        config = fireConfig;
    }
    // 后续对config执行统一操作
}

方法2:使用对象初始化器(更简洁)

如果喜欢紧凑的写法,可以用对象初始化器直接在创建子类实例时赋值属性:

foreach (XmlNode node in actionList) {
    ActionConfig config;
    if (/* 判定动作是"Fire"的条件 */) {
        config = new FireActionConfig() {
            speed = (float)node.Attributes["speed"].Value
        };
    }
    // 对config执行操作
}

方法3:强制类型转换(适合特殊场景)

如果你已经确定config此时就是FireActionConfig实例,可以用强制类型转换来访问子类属性,但要注意如果类型不匹配会抛出异常:

foreach (XmlNode node in actionList) {
    ActionConfig config;
    if (/* 判定动作是"Fire"的条件 */) {
        config = new FireActionConfig();
        // 强制转换后访问speed属性
        ((FireActionConfig)config).speed = (float)node.Attributes["speed"].Value;
    }
    // 对config执行操作
}

额外建议

如果后续还要添加更多动作类型(比如Move、Jump之类的配置类),建议把这些实例化和属性赋值的逻辑封装成工厂模式——比如写一个ActionConfigFactory类,接收XmlNode返回对应的配置实例,这样代码会更整洁,也方便后续扩展。

内容的提问来源于stack exchange,提问作者Evan Ward

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:34:33