Laden...

Object durch Type umwandeln

Erstellt von dennisspohr vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.297 Views
dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 14 Jahren
Object durch Type umwandeln

Hallo zusammen,

ich bekomme ein Objekt zurück und kenne in einer Type-Variable aus welchem Typ das Objekt besteht. Schaut euch am besten folgenden Code an:


            Type myType = typeof(BatchList);
            Object myObject = this.BatchList;
        
            using (FileStream fileStream = File.OpenRead("C:\\_batchList.xml"))
            {
                XmlSerializer xmlSerializer = new XmlSerializer(myType);               
                this.BatchList = xmlSerializer.Deserialize(fileStream);  // Funktioniert so nicht
            }

Normalerweise benutzt man ja folgendes:


this.BatchList = (BatchList)xmlSerializer.Deserialize(fileStream);

Nun müsste ich so etwas in der Art benutzen:


this.BatchList = (typeof(myType))xmlSerializer.Deserialize(fileStream);

Leider geht das so nicht. Gibt es eine andere Möglichkeit?
Danke für eure Hilfe!

Gruß Dennis

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo dennisspohr,

Nun müsste ich so etwas in der Art benutzen:

  
this.BatchList = (typeof(myType))xmlSerializer.Deserialize(fileStream);  
  

Warum musst du sowas machen? Ist in deinem Beispiel überhaupt nicht nötig.
Ändere dein Beispiel mal bitte so ab, dass man auch wirklich sieht, warum du das so machen musst.

EDIT: Generics kommen nicht in Frage?


public T Deserialize<T>()
{
   using (FileStream fileStream = File.OpenRead("C:\\_batchList.xml"))
   {
      XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
      return (T)xmlSerializer.Deserialize(fileStream);
   }
}

Gruß,
dN!3L

D
67 Beiträge seit 2009
vor 14 Jahren

Ich hätte da folgenden Ansatz, hab jetzt aber nicht probiert ob es funktioniert


this.BatchList = Convert.ChangeType(xmlSerializer.Deserialize(fileStream), this.BatchList.GetType());

5.941 Beiträge seit 2005
vor 14 Jahren

Hallo zusammen

Ich stimmt dN!3L zu.
Es gibt Situationen wo man sowas aber tatsächlich braucht.

Dann kann Converter.ChangeType() genutzt werden.
Allerdings brauchts dann auch hier einen Cast.

Darum funktioniert dein Vorschlag, so wie er da steht auch nicht, DaemNice.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 14 Jahren

Hallo zusammen,

erstmal danke für eure Hilfe.

Ich versuche gerade Addons für meine Anwendung zu schreiben. Jedes Addon besitzt Daten die mit dem Hautprogram per XmlSerializer gespeichert/geladen werden sollen. Nun hat jedes Addon natürlich verschiedene Daten, deshalb wollte ich ein Object nehmen und dieses dann speichern/laden.

Hilft euch das weiter?
Gruß Dennis

2.891 Beiträge seit 2004
vor 14 Jahren

Hilft euch das weiter?

Nein, nicht wirklich.
Warum kennst du zur Compilezeit denn den Typ nicht, in den du casten willst? Denn anscheinend kennst du doch aber den Typ der Variable, der der Wert zugewiesen wird.
Wie gesagt, ändere mal das Beispiel so, dass man sieht, warum du wie casten musst. Denn im Code oben braucht man das nicht.

Gruß,
dN!3L

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 14 Jahren

Hallo dN!3L,

Es gibt zum Beispiel das Addon "ResizeModule", das die Daten in "ResizeData" abspeichert. Außerdem gibt es das Addon "TonalityModule", das die Daten in "TonalityData" abspeichert, usw.

Ich kenne den Typ der Variable (z.B. ResizeData) da mir das Addon den Typ mitteilt. Nun bekomme ich noch das Object und soll das dann speichern. Das Hautprogramm weiß den Typ nicht, weil jedes Addon einen anderen Typ zum Speichern hat.

Gruß Dennis

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo Dennis,

Ich kenne den Typ der Variable (z.B. ResizeData) da mir das Addon den Typ mitteilt. Nun bekomme ich noch das Object und soll das dann speichern.

Und wohin speicherst du? Im Beispiel kennst du die Variable zur Compilezeit genau (this.BatchList), und damit auch ihren Typ. Daher ergibt sich das Problem auch nicht, was du beschreibst.

Gruß,
dN!3L

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 14 Jahren

Hallo dN!3L,

ich weiß nicht wie ich es besser beschreiben könnte. Zeigen ist auch nicht so leicht, mehrere Klassen, usw.

Gehen wir mal anderes dran: Ich habt ein Programm mit mehren Addons, nun sollen in einer einzigen Projektdatei alle (verschiedenen!) Einstellungen der Addons gespeichert werden. Wie würdet ihr vorgehen? Vielleicht ist mein Weg auch einfach zu umständlich oder gar der "falsche"..

Gruß Dennis

S
16 Beiträge seit 2009
vor 14 Jahren

hey,
kannst du nicht ein Interface implementieren welches eine saveConfig Methode verfühgbar macht ... musst dann ja nur den Typ des Interfaces instanziieren.

Das Speichern überlässt du den eigendlichen Objekten die wissen schon was sie wollen 😉.

lg

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo Dennis,

ich weiß nicht wie ich es besser beschreiben könnte. Zeigen ist auch nicht so leicht, mehrere Klassen, usw.

Mein "Problem" ist einfach nur, dass in deinem Beispielcode der Wert direkt an ein Property zugewiesen wird. Dessen Typ kennst du, also brauchst du auch nur dahin zu Casten. Du brauchst auch nicht in den genauen Typen casten, denn es gibt ja Polymorphie.
Also wohin speicherst du das deserialisierte Objekt, sodass du casten musst?

Beste Grüße,
dN!3L

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 14 Jahren

Hallo,

kannst du nicht ein Interface implementieren

Leider habe ich mich noch nie richtig mit Interfaces beschäftigt, habe mir aber schon gedacht, dass ich da vielleicht nicht dran vorbeikomme.

Das Speichern überlässt du den eigendlichen Objekten die wissen schon was sie wollen 😉.

Dann hätte ich eine Datei pro Addon, aber ich möchte ja alles in einer einzigen Projektdatei speichern.

Also wohin speicherst du das deserialisierte Objekt, sodass du casten musst?

Das deserialisierte Objekt bekommt das Addon um die Einstellungen in der Oberfläche anzuzeigen.

Gruß Dennis

S
16 Beiträge seit 2009
vor 14 Jahren

Dann hätte ich eine Datei pro Addon, aber ich möchte ja alles in einer einzigen Projektdatei speichern.

Muss nicht einfach den Path der Datei mit übergeben und z.:.: File.AppendAllText benutzen. 😉

msdn: File

lg.

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo,

Dann hätte ich eine Datei pro Addon, aber ich möchte ja alles in einer einzigen Projektdatei speichern.

Nö, du kannst ja z.B. einem XmlReader/XmlWriter "herumreichen". Dann hängt jedes Addon seinen Kram an/liest bis zum Ende seiner Einstellungen und dann kommt das nächste dran.

Das deserialisierte Objekt bekommt das Addon um die Einstellungen in der Oberfläche anzuzeigen.

Und wie denn? Weist du das Objekt direkt einem Feld zu/kennst du das Feld zur Laufzeit? Benutzt du Reflection? Weißt du das noch gar nicht und suchst du erst ein Konzept, wie man das überhaupt machen kann?

Gruß,
dN!3L

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo dennisspohr,

Leider habe ich mich noch nie richtig mit Interfaces beschäftigt, habe mir aber schon gedacht, dass ich da vielleicht nicht dran vorbeikomme.

möglicherweise könnten wir diesen Thread stark abkürzen, wenn du das tätest. Im Moment dreht sich das hier im Kreis.

Aber um das mal klar zu sagen: Casten ist eine Compilezeit-Geschichte. Der Typ muss zur Compilezeit bekannt sein. Sonst hat Casten auch gar keinen Sinn. Die vielen Nachfragen von dN!3L basieren darauf, dass Casten zur Laufzeit gar nichts bringen würde. Es nützt also auch nichts, da weiter zu bohren.

herbivore

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 14 Jahren

Hallo herbivore,

ja, du hast vermutlich Recht. Ich glaube mir fehlt das nötige Hintergrundwissen, deshalb "frimel" ich mir hier anscheinend irgendetwas zusammen.

Hallo dN!3L,

du kannst ja z.B. einem XmlReader/XmlWriter "herumreichen".

Die Idee gefällt mir. Ich müsste allerdings eine eigene Klasse dafür schreiben, denn ansonsten habe ich mehere XML-Header in einer Datei, oder? Oder kann der XMLSerializer das von alleine?

Gruß Dennis

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo Dennis,

Oder kann der XMLSerializer das von alleine?

Guck dir dazu mal IXmlSerializable an. (Hey, ein Interface!

Gruß,
dN!3L

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 14 Jahren

Hallo dN!3L,

ich werde mir dieses Interface mal anschauen 😃

Ich muss mich unbedingt mal mit Interfaces beschäftigen. In der Firma komme ich nicht dazu und zu Hause habe ich leider kaum Zeit - irgendwann...

Ich danke euch nochmals für eure Hilfe. Ich werde jetzt erstmal alleine versuchen weiterzukommen, ansonsten melde ich mich nochmal. Danke 😃

Gruß Dennis