Ich habe versucht, nach einer Antwort für dieses Problem zu suchen, konnte aber nicht viel finden, wahrscheinlich weil ich nicht weiß, wie ich es richtig suchen soll, also hier geht es. Alle Hilfe wird sehr geschätzt.
Mit der Basisklasse, die aussieht wie
%Vor%Und abgeleitete Klassen, die wie
aussehen %Vor% Zur Laufzeit erhält die Funktion eine Sammlung von "Property" -Objekten. Was muss ich tun, um den "Wert" eines jeden zu erhalten? Muss ich eine große if
-Anweisung haben, um den Typ jedes "Property" -Objekts abzufragen? Wenn nicht, gibt es eine elegantere Lösung?
Ich habe versucht, eine abstrakte "Value" -Eigenschaft zu definieren, die überschrieben werden sollte, aber da die Rückgabetypen unterschiedlich sind, hat es nicht funktioniert. Ich habe auch versucht, mit der Eigenschaft "Value" zu shadowing, aber ich konnte es nicht zum Laufen bringen. Die Idee, eine COM-ähnliche Variante zu verwenden, klingt auch nicht sehr passend.
Vielen Dank im Voraus.
BEARBEITEN:
Ich hätte Details hinzufügen sollen, was ich zu tun versuche. Die Eigenschaften werden in einer Winforms-App angezeigt. Unterschiedliche "TextBox" -Elemente repräsentieren unterschiedliche Eigenschaften und werden (je nach Typ) nach geeigneten Eingaben gefiltert. Die aktualisierten Werte werden zurückgelesen und gespeichert. Das Container-Objekt wird in JSON serialisiert und auf einem Android- und iPhone-Client deserialisiert. Diese Werte werden schließlich in eine Ebene weitergegeben, in der nativer C ++ - Code mit OpenGL-Code ausgeführt wird. Ich weiß nicht im Voraus die Art aller benötigten Eigenschaften, also wollte ich als Zwischenhändler meinen Code so robust wie möglich machen, während ich die OpenGL Engine füttern konnte.
Sie müssten einfach den object
-Typ verwenden. Was versuchst du zu erreichen? Das Problem hier ist nicht die Struktur Ihrer Klassen, es ist die Funktion, die die Sammlung von Property
-Objekten empfängt. Es ist unmöglich, etwas sogar auf einen unbekannten Typ zu übertragen, da Sie nicht wissen, in welcher Art von Variable es gespeichert werden muss.
Ihre Property.Value
-Eigenschaft muss also vom Typ object
sein. In Ihrer Methode, die die Objekte Property
verwendet, müssen Sie etwas mit ihnen tun, und was Sie tun, wird entscheiden, wie es strukturiert werden soll. Drucken Sie Werte aus? Lassen Sie eine *Value
-Klasse von einer abstrakten PropertyValue
-Klasse erben und überschreiben Sie ToString()
, um eine entsprechende String-Repräsentation zurückzugeben.
Sie können eine generische Klasse verwenden:
%Vor%Ich würde wirklich empfehlen, die Basisklasse zu einem Interface zu machen:
%Vor%Hier ist eine Beispielverwendung:
%Vor%Um die Konstruktion noch einfacher zu machen, können Sie eine Factory-Methode verwenden:
%Vor%Nicht unbedingt empfohlen, und ein bisschen OT:
Sie könnten es mit einer Erweiterungsmethode sogar noch lustiger machen:
%Vor%
Es würde ein wenig Umdenken erfordern, aber haben Sie erwogen, den dynamischen Typ (eingeführt in .net4) zu verwenden
Löst Ihr Problem nicht wirklich, aber Sie können es umgehen. Ihre Eigenschaften können grundsätzlich nur ein
sein %Vor%, der Fehler ist, dass sie erst zur Laufzeit ausgewertet werden, so dass Sie keine Compiler-Unterstützung für die Eingabe erhalten.
so, dass du willst int SomeValue = Meine Eigenschaften [SomePropertyName] + 10;
Also, wenn Meine Eigenschaften [SomePropertyName] = 10; // alles ist gut
Wenn es 76.52 oder Fred ist, wird der Zusatz eine Ausnahme an dem Punkt auslösen, der ausgeführt wird.
Code ist viel einfacher und sauberer, kein zusätzliches Casting und die Menge an benötigtem Gerüst ist minimal, ABER, Sie müssen Testcode einbinden, der das Wörterbuch ausgiebig und religiös verwendet.
Tags und Links c# abstract-class override polymorphism