Почему я не могу найти метод GetEnumerator() для типа IList с помощью отражения?

Этот код, конечно, действителен. 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 ответа

Решение

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

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

Это член IEnumerable,

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

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

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

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

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

MemberInfo[] member = iListType.GetMember("GetEnumerator", BindingFlags.Public);            
Другие вопросы по тегам