2013-05-12 83 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