Почему я не могу найти метод GetEnumerator () для типа IList с помощью отражения? - PullRequest
2 голосов
/ 15 декабря 2010

Этот код, конечно, действителен.IList по определению имеет метод GetEnumerator ().

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

Однако ни одно из следующего не может найти члена типа IList с именем GetEnumerator.

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 ]

2 голосов
/ 15 декабря 2010

Невозможно найти GetEnumerator для типа IList, поскольку тип IList не объявляет GetEnumerator.IList расширяет IEnumerable, который объявляет это.Поэтому вам нужно изменить код для поиска GetEnumerator для типа IEnumerable.

Type type = typeof(System.Collections.IEnumerable);
var member = type.GetMember("GetEnumerator");
2 голосов
/ 15 декабря 2010

Член IEnumerable.

1 голос
/ 15 декабря 2010

Не уверен, почему вы не можете искать членов для интерфейсов, которые реализовал интерфейс. Но чтобы обойти это использование:

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

Ваш код работает с типом класса, но не с типом интерфейса. Это странно. Я проверил это с помощью System.Collections.ArrayList, и он вернул один метод.

0 голосов
/ 15 декабря 2010

Возможно, вам нужно установить BindingFlags в этом случае.

Попробуйте это ...

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