[英]Get all derived methods of a method
给定C#
的方法,我需要在子类中找到所有直接或间接覆盖该方法的方法。
例如,给定以下类架构
abstract class A { public abstract void m(); }
class B : A { public override void m(){}; }
class C : A { public override void m(){}; }
class D : C { public override void m(){}; }
class E : C { public override void m(){}; }
class F : E { public override void m(){}; }
class G : C { }
class H : G { public override void m(){}; }
那么, Cm
的派生方法将是来自D,E,F,H类的方法。
我想出了以下解决方案,该解决方案似乎可以正常工作,但发现它有些麻烦。 我怀疑有一个聪明的方法可以做到这一点。 任何想法?
public static IEnumerable<MethodInfo> DerivedMethods(this MethodInfo mi)
{
return mi.DeclaringType.Assembly.GetTypes()
.Where(klass => klass.IsSubclassOf(mi.DeclaringType))
.Select(subclass => subclass.GetMethods(
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
.SingleOrDefault(m => m.GetBaseDefinition() == mi.GetBaseDefinition()))
.Where(x => x != null);
}
使它更紧凑的一种方法是改为使用LINQ关键字。
而且SingleOrDefault
调用有点多余。 每个类的每个方法最多只能有一个重写。
另外,我注意到您的代码仅适用于基类 。 接口的工作方式有些不同,不确定您是否也想实现吗?
public static IEnumerable<MethodInfo> DerivedMethods(this MethodInfo mi)
{
Type baseType = mi.DeclaringType;
IEnumerable<Type> subClasses = baseType.Assembly.GetTypes().Where((klass) => klass != baseType && baseType.IsAssignableFrom(klass));
if (baseType.IsInterface) {
return from klass in subClasses
where !klass.IsInterface
let map = klass.GetInterfaceMap(baseType)
select map.TargetMethods[Array.IndexOf(map.InterfaceMethods, mi)];
}
else {
return from klass in subClasses
where !klass.IsAbstract // include this only if you want instantiable classes
from m in klass.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
where m.GetBaseDefinition() == mi.GetBaseDefinition()
select m;
}
}
如果你想扩大搜索解决方案中的你会改变所有组件subClasses
来:
IEnumerable<Type> subClasses = from asm in AppDomain.CurrentDomain.GetAssemblies()
from klass in asm.GetTypes()
where klass != baseType && baseType.IsAssignableFrom(klass)
select klass;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.