1

我想处理从类 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对象的各种属性,但无法将其过滤掉。我确信我错过了一些愚蠢的检查,但已经为此苦苦挣扎了足够长的时间。

任何意见,将不胜感激。

4

1 回答 1

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);
于 2013-05-12T21:42:15.720 回答