Autor Beitrag
Stephan202
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Di 22.11.11 21:13 
Hallo,

ich habe folgendes Problem:

Es gibt eine Klasse abc, die alles an eine Klasse xyz vererbt.
In einer Klasse xyz sind zusätzlich verschiedene Properties definiert.
In der partial class abc ist eine Methode definiert, die, wenn sie aufgerufen wird
von der Klasse xyz oder einer anderen Klasse, die von abc geerbt hat, die Werte aller Properties
der Klasse auslesen soll, die die Methode aufgerufen hat.
Dies soll möglichst so dynamisch geschrieben sein,
dass man eine beliebige Zahl von Properties mit beliebigen Namen auslesen kann.

also nicht so: ausgelesener_Wert = xyz.property1
sondern in der Form: Ermittle die vorhandenen Properties von xyz
Lese die Werte dieser properties aus

ist so etwas mit C# irgendwie möglich?
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mi 23.11.11 07:57 
Hallo Stephan,
also nach dem 3. Mal lesen habe ich es erstmal gerafft, was Du machen willst.
Du hast eine Basisklasse abc und möchtest dort in einer Methode an Properties von Klassen kommen, die von abc erben!?
Oder ist abc partial und wird nur erweitert?

Der erste Fall: Nicht so wirklich. Denn woher soll denn die Klasse abc von der Klasse xyz wissen?
Du könntest natürlich über Umwege alle Klassen abfragen die geladen sind, dann abfragen, ob sie irgendwie von abc erben, und Dir dann die PropertyInfos zurückgeben lassen.
Aber wozu das Ganze?

Der 2.Fall: Wenn abc nur durch eine partial class erweitert wird, so kannst Du einfach die PropertyInfos abfragen (denn es ist ja EINE Klasse).
LG, Marko
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 23.11.11 10:55 
Hallo Stephan202,

das generelle Stichwort dafür lautet: Reflection.
ujr
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 102
Erhaltene Danke: 12



BeitragVerfasst: Mi 23.11.11 11:08 
user profile iconStephan202 hat folgendes geschrieben Zum zitierten Posting springen:
partial class abc


"partial" class ist keine spezielle Art von Klasse, sondern nur ein Schlüsselwort für den Compiler, das anzeigt, dass es zu dieser Klasse noch einen weiteren integralen Teil in einer anderen Datei geben kann. Insofern ist "partial" hier irrelevant.

Oder meinst Du eher "abstract"? Vielleicht beschreibst Du mal, was Du überhaupt machen willst.
Stephan202 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Mi 23.11.11 21:36 
Ok, ich versuch noch mal die Beschreibung.

ich habe eine Klasse, die heißt in meinem Fall Strategy.
In dieser ist eine Funktion definiert, die bestimmte Werte einlesen und verarbeiten soll.
sie ist derfiniert mit :

public void PerformanceToFile(<Input>)
{
hier wird was gerechnet und abgespeichert
}

Die Klasse strategy vererbt an diverse andere Klassen, u.a. an eine Klasse namens ParameterstudieSample

der Befehl lautet:

public class ParameterstudieSample : Strategy

in der Klasse ParameterstudieSample erfolgt innerhalb einer Methode der Aufruf der
Funktion PerformanceToFile(<Input>).

Diese soll nun alle Properties und deren Werte derjenigen Klasse ermitteln, von der sie aufgerufen wurde,
also in diesem Fall ParameterstudieSample.
Anschließend soll mit den ermittelten Werten weitergerechnet werden.
Die Funktion PerformanceToFile soll das nicht nur für ParameterstudieSample tun können,
sondern für alle Klassen, aus der diese Funktion aufgerufen wird.

Der Grund ist: Die Anzahl der auszulesenden Properties kann recht groß sein und
ich will vermeiden, bei jedem Aufruf der Funktion in einer anderen Klasse jeweils von Hand
ein Array mit den jeweiligen zu übergebenden Werten zu basteln.

Das Stichwort partial ist hier im Grunde wirklich irrelevant, deshalb geh ich nicht mehr drauf ein.
Ich hoffe, dass das Ganze jetzt etwas verständlicher ist :-)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 23.11.11 22:16 
Zitat:
Ich hoffe, dass das Ganze jetzt etwas verständlicher ist


Nur ein wenig. Du sagst hier das du beliebige Properties von beliebigen Klassen ermitteln willst um damit was zu berechnen. Entweder die Properties sind nicht so beliebig wie du uns glauben machen willst oder es ist Unsinn(sowas wie 'Berechne mir die Quersumme jeder dritten Integer Property'). Auf jeden Fall fällt mir nicht ein was man sinnvolles berechnen will mit Properties die man vorher nicht mal ansatzweise kennt.

Das relevante Stichwort wenn man sowas machen will ist aber schon gefallen. Reflection. Sieh dir die Type Klasse an. Dort wirst du alles finden um einen Typen auszuwerten. Da ich deine Beschreibung aber immer noch für unvollständig bzw. merkwürdig halte denke ich das du eine Lösung eher in der Ecke von sauberen Interface Definitionen oder Darstellung von Properties als Dictionaries (oder irgendwelcher anderen Key-Value Paare) suchen solltest.
Stephan202 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Do 24.11.11 00:08 
OK, ich hab nun folgendes gemacht.
ausblenden C#-Quelltext
1:
Type t = typeof(ParameterstudieSample);					

t übergebe ich dann an die aufrufende Funktion.
In dieser gehts dann weiter:
ausblenden C#-Quelltext
1:
2:
PropertyInfo[] propertyInfos;
propertyInfos = t.GetProperties();

Wie komm ich nun an die Werte der Properties ran?
Ich will sie in einer Datei speichern.
Mit GetValue() hab ich bis jetzt nur Fehlermeldungen bekommen
und die Microsoft-Beschreibung nicht auf mein Beispiel angewendet bekommen.

Noch eine Frage: Wie ließt man einen Wert aus einer Variable des Typs object aus?

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 24.11.11 00:41 
Zitat:
Wie komm ich nun an die Werte der Properties ran?


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
foreach (PropertyInfo propinfo in propertyInfos)

    object value = propinfo.GetValue(x, null);
    // mach was mit value            
}


Wenn du Indexer Properties dabei hast mußt du noch per GetIndexParameters der PropertyInfo alle Elemente der Property auslesen.

Zitat:
Noch eine Frage: Wie ließt man einen Wert aus einer Variable des Typs object aus?


Gar nicht. Da Object irgendwas sein kann ist die Definition was Wert eine Objects ist auch nicht eindeutig(string ok aber was ist der Wert von Form oder Control?). Das nächste was an Wert von beliebigem Object kommt wäre wohl das was dir ein BinaryFormatter oder irgendeiner der Serializer liefert.

Zitat:
Wie komm ich nun an die Werte der Properties ran?
Ich will sie in einer Datei speichern.


Du willst den Zustand irgendeiner Instanz speichern? Dann solltest du einfach wie oben schon erwähnt einfach das Object durch einen der Serializer(XML, JSON etc.) oder den BinaryFormatter jagen und das Persistieren. Keine Notwendigkeit die Oberfläche des Objects selbst abzufragen und sich irgendwas zu basteln.
Stephan202 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Do 24.11.11 19:55 
[quote="user profile iconRalf Jansen"(654753)]
Zitat:
Wie komm ich nun an die Werte der Properties ran?


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
foreach (PropertyInfo propinfo in propertyInfos)

    object value = propinfo.GetValue(x, null);
    // mach was mit value            
}


Was muss bei x rein?


Zitat:
Noch eine Frage: Wie ließt man einen Wert aus einer Variable des Typs object aus?
Gar nicht. Da Object irgendwas sein kann ist die Definition was Wert eine Objects ist auch nicht eindeutig(string ok aber was ist der Wert von Form oder Control?). Das nächste was an Wert von beliebigem Object kommt wäre wohl das was dir ein BinaryFormatter oder irgendeiner der Serializer liefert.


In dem object ist per Definition entweder ein String, double, integer oder bool - Wert oder enum-Wert drin.
Ich bräuchte irgendein Kommando wie
wenn Wert von object = typ boolean, dann mach dieses mit dem Wert
wenn Wert von object = typ double, dann mach jenes mit dem Wert
usw.

unboxing nennt sich sowas wohl glaube ich.

Zitat:
Wie komm ich nun an die Werte der Properties ran?
Ich will sie in einer Datei speichern.
Du willst den Zustand irgendeiner Instanz speichern? Dann solltest du einfach wie oben schon erwähnt einfach das Object durch einen der Serializer(XML, JSON etc.) oder den BinaryFormatter jagen und das Persistieren. Keine Notwendigkeit die Oberfläche des Objects selbst abzufragen und sich irgendwas zu basteln.


Ich brauch nur bestimmte properties der Klasse, nicht alle, die in dieser vorhanden sind, habe ich mittlerweile festgestellt.

Die, die ich brauche, befinden sich in einem Container namens myclass.parameters
Die einzelnen Parameter sind mittels parameters[index] als object variable greifbar.
An deren Namen komme ich mittels object.name ran.
Nur mit den Werten weiss ich noch nicht wies geht.
Muss wohl die möglichen Datentypen irgendwie abfangen.