2010-12-15 70 views
2

這段代碼當然是有效的。根據定義,IList有一個GetEnumerator()方法。爲什麼我無法通過反射找到IList類型的GetEnumerator()方法?

System.Collections.IList list = new List<string>(); 
System.Collections.IEnumerator ienum = list.GetEnumerator(); 

但是以下都不能找到名爲GetEnumerator的IList類型的成員。

Type iListType= typeof(System.Collections.IList); 
var member = iListType.GetMember("GetEnumerator"); 
var members = iListType.GetMembers().Where(x => x.Name == "GetEnumerator"); 
var method = iListType.GetMethod("GetEnumerator"); 
var methods = iListType.GetMethods().Where(x => x.Name == "GetEnumerator"); 

回答

2

你不能找到在IList類型GetEnumerator,因爲IList類型不聲明GetEnumeratorIList延伸IEnumerable它聲明它。因此,您需要更改代碼以在IEnumerable類型上查找GetEnumerator

Type type = typeof(System.Collections.IEnumerable); 
var member = type.GetMember("GetEnumerator"); 
2

它是IEnumerable的成員。

0

在這種情況下,您可能需要設置BindingFlags

嘗試......

MemberInfo[] member = iListType.GetMember("GetEnumerator", BindingFlags.Public);    
+0

錯了。 BindingFlags參數的默認值是BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance'包含'BindingFlags.Public'。 – dtb 2010-12-15 06:36:05

1

不知道爲什麼您無法查找接口已實現的接口的成員。但要解決此問題,請使用:

var member = iListType.GetInterfaces().Union(new Type[] { iListType }).SelectMany(t => t.GetMember("GetEnumerator")); 

您的代碼適用於類類型,但不適用於接口類型。這很奇怪。我用System.Collections.ArrayList進行了檢查,並返回了一種方法。

+0

我知道。但是,我不確定爲什麼我們沒有一個簡單的方法(可能使用'BindingFlags')來查找基接口類型中定義的方法。 – decyclone 2010-12-15 06:45:38

相關問題