Dynamisch innerhalb eigene Klasse Abbindeeigenschaft

stimmen
3

Ich glaube, ich bin ganz in der Nähe dieses herausgefunden haben, aber ich habe seit einiger Zeit nicht Fortschritte jetzt und nicht wirklich eine Wahl haben, sondern um zu fragen.

Ich habe eine GraphicsSettingsKlasse mit einem großen Satz von Grafikeigenschaften. Diese Eigenschaften haben einen Platzhalter - Wert mit dem Namen der Eigenschaft, die ich für eine Vergleichs - Schleife verwenden.

Die Vergleichs - Schleife ist eine Funktion innerhalb der Klasse und ist zwischen einer Anordnung der Grafikeigenschaften und einem StringreaderHinausgehen über Leitungen in einer externen Textdatei.

Wenn die Schleife eine Übereinstimmung zwischen dem Wert einer Eigenschaft graphics findet, und ein Teil von dem, was in einer Linie ist, möchte ich den gesamten Wert der Linie in der Grafik-Eigenschaft festlegen.

Hier ist das Problem aber ich weiß nicht, wie die Eigenschaft Setter anrufen aus der Klasse ohne speziell eingeben seinen Namen aus, die ich nicht da sein einer Schleife tun.

Ich habe versucht mit:

this.GetType().GetProperty(key).SetValue(this,line, null);

Wo „Schlüssel“ ist der Name der Eigenschaft und „Linie“ wird die Zeile Wert. Von dem, was ich verstehe, sollte dies gut funktionieren, wenn ein Klassenobjekt von außen ruft einen Wert zu setzen, aber es scheint, ganz zu sein gegen eine Klasse von innen Aufruf dieser Methode.

Alles , was ich eine bekommen TargetInvocationException was unhandledFehler. Nicht allzu überraschend, aber ich weiß nicht , wie dies zu umgehen.

Also ich denke, es kommt auf diese: Wie kann ich eine Eigenschaft durch die Verwendung einer Schnur, aus dem Innern der gleichen Klasse, wo das Grundstück liegt?

Veröffentlicht am 04/03/2013 um 13:30
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
4

Wenn die Eigenschaften nicht öffentlich sind, müssen Sie möglicherweise verbindlich Fahnen verwenden, da das GetPropertyVerfahren nicht weiß, dass Sie sie in der Zielklasse fordern. C # 's gelten Regeln der Zugänglichkeit zu dem statischen Codetext und gelten hier nicht.

PropertyInfo prop = this.GetType().GetProperty(key, BindingFlags.Instance | 
                                                    BindingFlags.NonPublic);
prop.SetValue(this, "data", null);

Beachten Sie, dass eine Eigenschaft der Suche Groß- und Kleinschreibung. Daher könnten Sie auch die einschließen müssen IgnoreCaseFlagge.

PropertyInfo prop = this.GetType().GetProperty(key, BindingFlags.Instance |
                                                    BindingFlags.NonPublic |
                                                    BindingFlags.IgnoreCase);
prop.SetValue(this, "data", null);

Wenn Sie Ihre Eigenschaften statisch waren, würden Sie die angeben BindingFlags.StaticFlagge statt BindingFlags.InstanceFlagge. Sie können auch als auch kombinieren sowohl BindingFlags.NonPublic | BindingFlags.Publicfür gemischte Fälle.


Beachten Sie auch , dass die Typen übereinstimmen müssen. Die impliziten Typumwandlungen von C # funktionieren hier nicht. So bieten immer den richtigen Typ für den Wertparameter (zweiter Parameter) von SetValue. Z.B

string input = "123";
prop.SetValue(this, Int32.Parse(input), null);

int i = 77;
prop.SetValue(this, (double)i, null);

Konvertiert auch eine intzu einem doubleausdrücklich, wenn die Eigenschaft vom Typ ist double.


Chris Kerekes schlägt vor , mit prop.MemberTypein Verbindung mit dieser über Convert.ChangeTypeeinen voll dynamischen Ansatz zu erhalten, wenn Sie Objekte mit unterschiedlichen Typen haben funktioniert (zumindest für die gängigsten Typen).

prop.SetValue(this, Convert.ChangeType(line, prop.MemberType), null);
Beantwortet am 04/03/2013 um 14:02
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more