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%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.
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.
Wenn Sie sequenzielle Indexnummern in einer indizierten Eigenschaft haben, können Sie darauf nicht wetten.
Indizierte Eigenschaften sind keine Arrays.
Gegenbeispiel:
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
IEnumerable<T>
für den Typ selbst. 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.
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.
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%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);
}
Tags und Links .net c# reflection