我想处理从类A派生的类的方法。类A和派生类驻留在不同的程序集中。我使用反射来从派生的程序集中获取所有System.Type并迭代它们的方法。
Assembly A: class Template {...}
Assembly B: class X: A.Template {...}
Assembly B: class Y: A.Template {...}
Assembly B: class Z: A.Template {...}
当我尝试在程序集X
中迭代类B
的方法时,它包含了类A
的所有方法。我想要实现的只是迭代派生类中存在的那些方法。
我认为在不同的程序集中根本不重要,但即使我尝试根据程序集过滤方法的声明类型,它也不起作用。
我已尝试使用MethodInfo
对象的各种属性,但无法对其进行过滤。我确信我错过了一些愚蠢的检查,但一直在努力解决这个问题。
任何建议都将受到赞赏。
答案 0 :(得分:3)
您可以使用它来获取程序集中的所有派生类型:
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);