durchläuft eine indizierte Eigenschaft (Reflection)

8

Ich möchte über eine indizierte Eigenschaft iterieren, zu der ich nur über Reflektion Zugang habe,

aber (und ich sage dies in dem vollen Wissen, dass es wahrscheinlich eine peinlich einfache Antwort gibt, MSDN / Google scheitern = /) Ich kann keinen Weg finden / denken, außer einen Zähler über den PropertyInfo.GetValue(prop, counter) zu erhöhen, bis der TargetInvocationException wird geworfen.

ala:

%Vor%

Jetzt gibt es einige Probleme mit dieser ... sehr hässlichen .. Lösung ..

Was ist, wenn es zum Beispiel multidimensional oder nicht durch Ganzzahlen indiziert ist ...

ist der Test-Code, den ich benutze, um zu versuchen, es zum Laufen zu bringen, wenn jemand es braucht. Wenn irgendjemand interessiert ist, mache ich ein benutzerdefiniertes Caching-System und Equals schneidet es nicht ab.

%Vor%     
Dead.Rabit 24.11.2010, 15:08
quelle

6 Antworten

8

Der Getter eines Indexers ist genau wie die normale Methode, außer dass er eckige Klammern, nicht runde, verwendet. Sie würden nicht erwarten können, den Bereich akzeptabler Werte für eine Methode automatisch bestimmen zu können, daher ist dies für einen Indexer nicht möglich.

    
Tim Rogers 24.11.2010, 15:14
quelle
4

Indexer werden zu Methoden kompiliert. Hier ist ein Beispiel:

%Vor%

Es wird zu etwas wie diesem kompiliert werden:

%Vor%

Der folgende Code kann nicht kompiliert werden, da zwei double get_Item(int) -Methoden in der Klasse vorhanden sind. Indexer ist eine Zauberei des Compilers.

%Vor%     
Danny Chen 24.11.2010 15:49
quelle
3

Wenn Sie sequenzielle Indexnummern in einer indizierten Eigenschaft haben, können Sie darauf nicht wetten.
Indizierte Eigenschaften sind keine Arrays.
Gegenbeispiel:

%Vor%

Abhängig vom Typ haben Sie normalerweise andere Methoden, um die möglichen Indexwerte zu erhalten, in diesem Fall dictionary.Keys . Wenn es mit deinen Typen möglich wäre würde ich in dieser Reihenfolge versuchen

  1. Implementieren Sie IEnumerable<T> für den Typ selbst.
  2. Wenn Sie mehrere indexierte Eigenschaften haben, können Sie für jede indizierte Eigenschaft eine entsprechende IEnumerable<T> -Eigenschaft implementieren.

Wenn Sie keine gültigen Werte angeben und keine Frage haben, was die gültigen Werte sind, dann haben Sie ziemlich viel Glück.

    
Albin Sunnanbo 24.11.2010 15:32
quelle
2

Sie können PropertyInfo.GetIndexParameters verwenden, um die Nummer herauszufinden und Typ der indizierten Eigenschaftsparameter.

Ich glaube nicht, dass Sie irgendetwas tun können, um herauszufinden, welche "legalen" Werte für diese Parameter gelten, es sei denn, Sie "schummeln" und verwenden Insiderinformationen, die Sie möglicherweise über diese Eigenschaft haben.

    
Jon 24.11.2010 15:13
quelle
1

Es wurde gemanagt, um eine Verbesserung zu erreichen, auch, dass dieser Testcode unter unendlichen Schleifen für Selbstreferenzen leidet (Array.Syncroot zum Beispiel)

Kurz gesagt, es findet nun Dinge, die von IEnumerable erben (die am meisten indizierten Dinge sind) und eine foreach-Schleife für diese benutzen und mit dem Wissen, dass der existierende (hässliche) Code für Strings funktioniert, ist es nun viel gründlicher es war einmal ...

Ich bin froh, aber enttäuscht, dass es keine nette Antwort zu geben scheint.

Danke für die Hilfe alle

Aktualisierter Testcode, wenn sich jemand in einer ähnlichen Position befindet

%Vor%     
Dead.Rabit 24.11.2010 17:06
quelle
0

Die obigen Codes und die verwandten Codes zu dieser Frage waren wirklich hilfreich für das Problem, mit dem ich konfrontiert war. Ich poste meinen Code und ich hoffe, dass dieser auch für euch funktioniert.

public ActionResult Survey(SurveyCollection surveyCollection) { if (surveyCollection != null) { Answer_DropDownCordinateOptionList traceObject = new Answer_DropDownCordinateOptionList(); IList traceObjectCollection = new List(); traceObjectCollection = ExtractNestedObjects(surveyCollection, traceObject, traceObjectCollection); }

%Vor%

    
Deepak Nair 28.05.2014 14:07
quelle

Tags und Links