2

这段代码当然是有效的。根据定义,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");
4

4 回答 4

2

GetEnumerator你在类型上找不到IList,因为IList类型没有声明GetEnumerator. IListextendsIEnumerable声明它。因此,您需要更改代码以查找GetEnumerator类型IEnumerable

Type type = typeof(System.Collections.IEnumerable);
var member = type.GetMember("GetEnumerator");
于 2010-12-15T06:25:57.637 回答
2

它是 的成员IEnumerable

于 2010-12-15T06:08:49.643 回答
1

不知道为什么不能为接口已实现的接口查找成员。但要解决此使用:

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

您的代码适用于类类型,但不适用于接口类型。这很奇怪。我检查了它,System.Collections.ArrayList它返回了一种方法。

于 2010-12-15T06:33:52.923 回答
0

BindingFlags在这种情况下,您可能需要设置。

尝试这个...

MemberInfo[] member = iListType.GetMember("GetEnumerator", BindingFlags.Public);            
于 2010-12-15T06:13:54.857 回答