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

在C#中如何获取直接基类方法而非最原始基类方法?

获取直接父类的重写方法实现

当然可以实现!先来说说为什么你现在用GetBaseDefinition()拿到的是A类的方法——因为这个方法的作用是找到虚方法最初被定义的那个基类实现,而不是当前类型的直接父类里的重写版本。

回到你的代码场景:

class A { public virtual void Func() { } }
class B : A { public override void Func() => base.Func(); }
class C : B { public override void Func() => base.Func(); }

var type = typeof(C);
var method = type.GetMethod("Func");
// 当前返回A
method.GetBaseDefinition().DeclaringType.Name;
method.GetRuntimeBaseDefinition().DeclaringType.Name;

要拿到B类的Func方法,核心思路是:先获取当前类型的直接基类(也就是B),然后从这个基类里查找和当前方法签名完全匹配的方法。这里有两种可靠的实现方式:

方式一:基于方法名和参数类型精准查找

这种方法适合避免重载方法的干扰,确保拿到的是和当前方法签名一致的版本:

var type = typeof(C);
var currentMethod = type.GetMethod("Func");

// 获取直接父类
var baseType = type.BaseType;
// 根据当前方法的签名(名称+参数类型)查找父类中的方法
var parentMethod = baseType.GetMethod(
    currentMethod.Name,
    currentMethod.GetParameters().Select(p => p.ParameterType).ToArray()
);

// 此时parentMethod.DeclaringType.Name会返回"B"
Console.WriteLine(parentMethod.DeclaringType.Name);

方式二:使用绑定标志简化查找(无重载场景)

如果你的方法没有重载,也可以直接用绑定标志指定实例+公共方法来查找:

var type = typeof(C);
var currentMethod = type.GetMethod("Func");
var parentMethod = type.BaseType.GetMethod("Func", BindingFlags.Instance | BindingFlags.Public);

Console.WriteLine(parentMethod.DeclaringType.Name); // 输出"B"

额外说明

如果你的继承链更长,或者需要递归查找某一层的重写方法,还可以基于这个思路扩展:比如循环遍历基类,直到找到你需要的那个层级的方法实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:37:41