2010-12-15 6 views
2

Dieser Code ist natürlich gültig. IList per Definition hat eine GetEnumerator() -Methode.Warum kann ich die GetEnumerator() -Methode für den IList-Typ nicht durch Reflektion finden?

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

jedoch keiner der folgenden in der Lage, ein Mitglied der IList Typ mit dem Namen GetEnumerator zu finden.

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"); 

Antwort

2

Sie nicht GetEnumerator auf dem IList Typ finden, weil die IList Typ nicht GetEnumerator nicht erklären. IList erweitert IEnumerable, die es erklärt. Sie müssen also Ihren Code ändern, um nach GetEnumerator auf dem IEnumerable Typ zu suchen.

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

Es ist ein Mitglied von IEnumerable.

0

Möglicherweise müssen Sie in diesem Fall BindingFlags setzen.

Try This ...

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

Falsch. Der Standardwert für den Parameter 'BindingFlags' ist 'BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance', die 'BindingFlags.Public' enthält. – dtb

1

Nicht sicher, warum Sie nicht nach Mitgliedern für Schnittstellen suchen können, die eine Schnittstelle implementiert hat. Aber diese Nutzung umgehen:

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

Sie Code arbeitet mit einem Klasse-Typ, aber nicht ein Interface-Typ. Das ist komisch. Ich habe es mit System.Collections.ArrayList überprüft und es gab eine Methode zurück.

+0

Ich weiß das. Aber ich bin mir nicht sicher, warum wir keine einfache Möglichkeit haben (nach 'BindingFlags'), nach Methoden zu suchen, die in Basistypen definiert sind. – decyclone