Почему я не могу найти метод 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");
Не уверен, почему вы не можете искать членов для интерфейсов, которые реализовал интерфейс. Но чтобы обойти это использование:
var member = iListType.GetInterfaces().Union(new Type[] { iListType }).SelectMany(t => t.GetMember("GetEnumerator"));
Ваш код работает с типом класса, но не с типом интерфейса. Это странно. Я проверил это с System.Collections.ArrayList
и он вернул один метод.
Возможно, вам нужно установить BindingFlags
в этом случае.
Попробуй это...
MemberInfo[] member = iListType.GetMember("GetEnumerator", BindingFlags.Public);