如何正确使用new关键字隐藏的方法?反射调用代码是否正确?
问题分析与修正
这段反射代码不正确,存在两个核心问题:
- Invoke目标实例错误:
SomeMethod是Figure/Pawn的实例方法,调用时必须传入figure对象作为执行目标,而非this(当前Board类的实例)。传入this会触发TargetException,因为方法所属类型与目标实例类型不匹配。 - 方法查找的潜在风险:虽然
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
相关产品推荐
相关产品推荐

