在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
相关产品推荐
相关产品推荐

