通过反射确定派生类

时间:2013-05-12 21:30:28

标签: c# .net inheritance reflection

我想处理从类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对象的各种属性,但无法对其进行过滤。我确信我错过了一些愚蠢的检查,但一直在努力解决这个问题。

任何建议都将受到赞赏。

1 个答案:

答案 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);