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

如何正确使用new关键字隐藏的方法?反射调用代码是否正确?

问题分析与修正

这段反射代码不正确,存在两个核心问题:

  1. Invoke目标实例错误:SomeMethod是Figure/Pawn的实例方法,调用时必须传入figure对象作为执行目标,而非this(当前Board类的实例)。传入this会触发TargetException,因为方法所属类型与目标实例类型不匹配。
  2. 方法查找的潜在风险:虽然figure.GetType().GetMethod(nameof(Figure.SomeMethod))能找到Pawn的SomeMethod,但因Pawn用new关键字隐藏了基类方法,这种写法依赖方法名称的严格匹配,后续方法签名变化时容易出现查找失败。

修正后的代码

要正确调用Pawn的SomeMethod,需将Invoke的目标实例改为figure:

var result2 = figure.GetType().GetMethod(nameof(Figure.SomeMethod)).Invoke(figure, new object[] { });

额外优化建议

如果你的需求是实现多态调用,完全不需要使用反射:将基类方法声明为virtual,派生类用override重写即可,这才是C#多态的标准实现方式:

public abstract class Figure
{
    public virtual bool SomeMethod()
    {
        return true;
    }
}

public class Pawn : Figure
{
    public override bool SomeMethod()
    {
        return false;
    }
}

此时直接执行figure.SomeMethod()就会返回false,无需反射就能达成预期效果。

内容的提问来源于stack exchange,提问作者Kacper Oracz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:50:25