2013-05-12 74 views
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对象的各种属性,但一直未能过滤掉它。我确信我错过了一些愚蠢的检查,但一直在挣扎着这么久。

任何意见,将不胜感激。

+0

'BindingFlags.DeclaredOnly' help any? – 2013-05-12 21:38:52

+1

您是否尝试过使用'DeclaredOnly'绑定标志获取方法? 'typeof(X).GetMethods(BindingFlags.DeclaredOnly)' – 2013-05-12 21:39:01

+0

谢谢。我实际上是在寻找私有方法,字段和属性,并没有意识到你必须使用'BindingFlags.Instance | BindingFlags.NonPublic'标志。那,除了BindingFlags.Declared,只工作。 – 2013-05-13 10:10:38

回答

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的任何子类上定义的方法(例如的子类),使用这个:

Type templateType = typeof(Template); 
Type derived = ... 
var methods = derived.GetMethods() 
        .Where(m => templateType.IsAssignableFrom(m.DeclaringType) && 
           templateType != m.DeclaringType); 
+1

谢谢。我实际上是在寻找私有方法,字段和属性,并没有意识到你必须使用BindingFlags.Instance | BindingFlags.NonPublic标志。那,除了BindingFlags.Declared,只工作 – 2013-05-13 10:11:09