确定通过反射派生类(Determining derived classes through refl

2019-09-02 18:20发布

我要处理的从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对象,但一直没能过滤了这一点。 我相信,我错过了一些愚蠢的检查,但一直与这个挣扎足够长的时间。

任何意见,将不胜感激。

Answer 1:

您可以使用它来获取所有派生类型的组件:

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


文章来源: Determining derived classes through reflection