C #: Eigenschaften mit verschiedenen Rückgabetypen für abgeleitete Klassen

7

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.

    
alokoko 12.11.2011, 22:23
quelle

4 Antworten

3

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.

    
Ry︁ 12.11.2011, 22:30
quelle
13

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%

    
sehe 12.11.2011 22:26
quelle
2

Ich habe ein paar Änderungen an Ihrem Beispielcode vorgenommen und dieses Ergebnis erhalten ...

%Vor%

Die Werte werden ordnungsgemäß in der Konsole ausgegeben.

    
Gayot Fow 12.11.2011 22:47
quelle
2

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.

    
Tony Hopkinson 12.11.2011 22:51
quelle