通过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);