通过reflection确定派生类

我想处理从类A派生的类的方法。类A和派生类驻留在不同的程序集中。 我使用reflection从派生的程序集中获取所有System.Type并迭代它们的方法。

Assembly A: class Template {...} Assembly B: class X: A.Template {...} Assembly B: class Y: A.Template {...} Assembly B: class Z: A.Template {...} 

当我尝试在程序集B迭代类X的方法时,它包含了类A所有方法。 我想要实现的只是遍历派生类中存在的那些方法。

我认为在不同的程序集中根本不重要,但即使我尝试根据程序集过滤方法的声明类型,它也不起作用。

我已经尝试使用MethodInfo对象的各种属性,但无法过滤掉它。 我确信我错过了一些愚蠢的检查,但一直在努力解决这个问题。

任何意见,将不胜感激。

您可以使用它来获取程序集中的所有派生类型:

 Assembly b = Assembly.LoadFrom(@"c:\B.dll"); var derivedTypes = b.GetTypes().Where(t => typeof(Template).IsAssignableFrom(t)); 

这样可以找到在该类型上定义的任何方法:

 Type derived = ... var methods = derived.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); 

或这个:

 var methods = derived.GetMethods().Where(m => m.DeclaringType == derived); 

但是,如果要查找在Template任何子类(例如X的子类)上定义的方法,请使用:

 Type templateType = typeof(Template); Type derived = ... var methods = derived.GetMethods() .Where(m => templateType.IsAssignableFrom(m.DeclaringType) && templateType != m.DeclaringType);