Benutzer mit den meisten Antworten
Frage zu Property

Frage
-
Hallo,das Problem ist diese Klasse
Datentyp T, der value kann mal int, string usw. sein.
[Serializable] public class PROPERTY<T> { [XmlAttribute] public T value { get; set; }
<ToDo> <PROGRAM value="testProgram" /> <NAME value="WhiteEquipment" /> <QUANTITY value="1000" /> <ACTUAL value="167" /> <UNIT value="2" /> <COUNTMETHOD value="1" /> </ToDo>
Prinzipiell tut es.
Problem, wenn andere Datentypen dazukommen.
Kennt Ihr evtl. elegantere Lösungen?Viele Grüße Sandraforeach (var propertyInfo in properties) { if (propertyInfo.IsDefined(typeof(XmlCommentAttribute), false)) { writer.WriteComment( propertyInfo.GetCustomAttributes(typeof(XmlCommentAttribute), false) .Cast<XmlCommentAttribute>().Single().Value); } var propType = propertyInfo.PropertyType; var objectTypeForXmlComment = propertyInfo.GetValue(this, null); var objectTypeForXmlCommentType = propertyInfo.GetValue(this, null).GetType(); string type; PROPERTY<string> variableValueString = new PROPERTY<string>(); PROPERTY<int> variableValueInt = new PROPERTY<int>(); foreach (var item in objectTypeForXmlCommentType.GetProperties()) { type = item.PropertyType.Name; if (objectTypeForXmlComment == null) continue; switch (type) { case "String": variableValueString = objectTypeForXmlComment as PROPERTY<string>; if (variableValueString.value != null) writer.WriteElementString(propertyInfo.Name, variableValueString.value.ToString()); break; case "Int32": variableValueInt = objectTypeForXmlComment as PROPERTY<int>; writer.WriteElementString(propertyInfo.Name, variableValueInt.value.ToString()); break; } } //writer.WriteElementString(propertyInfo.Name, propertyInfo.GetValue(this, null).ToString()); }
Antworten
-
Hi Sandra,
eine Demo zum Einfügen eines Kommentars beim Serialisieren habe ich unten beigefügt.Eine XML Deklaration mit value-Attribut ist erst einmal nicht schlecht. Das bedeutet aber, dass bei Nutzung der Standard-Serialisierung und -Deserialisierung jedes Element eine separate Klasse ist. Wenn Dir das nicht passt und Du es anders haben willst, musst Du einen Serializer selbst programmieren.
using System; using System.IO; using System.Linq; using System.Text; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; namespace ConsoleApplication1CS { class Program23 { static void Main(string[] args) { try { var d = new Program23Data() { Info = "TestText" }; XmlSerializer ser = new XmlSerializer(typeof(Program23Data)); MemoryStream str = new MemoryStream(); ser.Serialize(str, d); Console.WriteLine(Encoding.Default.GetString(str.ToArray())); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.Write("Fertig"); Console.ReadKey(); } } public class Program23Data : IXmlSerializable { [XmlComment("Hier der Kommentar.")] public string Info { get; set; } public void WriteXml(XmlWriter writer) { var properties = GetType().GetProperties(); foreach (var propertyInfo in properties) { if (propertyInfo.IsDefined(typeof(XmlCommentAttribute), false)) { writer.WriteComment( propertyInfo.GetCustomAttributes(typeof(XmlCommentAttribute), false) .Cast<XmlCommentAttribute>().Single().Comment); } writer.WriteElementString(propertyInfo.Name, propertyInfo.GetValue(this, null).ToString()); } } public XmlSchema GetSchema() { throw new NotImplementedException(); } public void ReadXml(XmlReader reader) { throw new NotImplementedException(); } } [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] public class XmlCommentAttribute : Attribute { public XmlCommentAttribute(String comment) { this.Comment = comment; } public string Comment { get; set; } } }
--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen! Leben retten!
Wir essen Opa.
Wir essen, Opa.- Als Antwort markiert Sandra Bauer Donnerstag, 4. August 2016 16:23
-
Hallo,
da meine Meinung zählt nicht, folglich verstecke Dich nicht dahinter... Du solltest mal was tun, denn wir reden endlos über Kleinkram.
Wenn die (IMVHO überflüssigen) Kommentare sein müssen, kann man sie in der gezeigten Lösung als XComment ebenso einfügen wie ein XElement.
Genauso wie man den Code durch ein, zwei Methoden vereinfachen könnte, aber das überlasse ich Dir.
Umgekehrt: Verwendet man Reflection (die ebenso mit XElement möglich wäre), so muss man darauf achten, dass die Reihenfolge mit dem geforderten Schema übereinstimmt. Sonst klapperts am anderen Ende.
Gruß Elmar
- Als Antwort markiert Sandra Bauer Donnerstag, 4. August 2016 16:23
Alle Antworten
-
Hallo Sandra,
was verstehst du unter Eleganter? Dein Code macht halt genau das für was er gedacht ist. Wenn du ein komplexes Objekt als Typparameter übergibst wird das bisher entsprechend verarbeitet. Man kann nicht alles beliebig stark abstrahieren, irgendwann setzt dir das Framework Grenzen.
Wenn es "schön" Objektorientiert geschrieben wäre, dann würdest du nirgends unterscheiden was T nun wirklich ist, sondern immer nur auf das zurück greifen was T in jedem Fall garantiert bietet. Für dich (vielleicht) verwendbar ist da vermutlich nur ToString. Es sei denn du schränkst T mittels einer where-Klausel weiter ein.
- Wenn du nur Attribute und keine Elemente verwenden willst...
dann rufe einfach ToString beim serialisieren auf und gucke was der jeweilige Typ für Methoden zum deserialisieren bietet. Mehr oder weniger so macht das auch der Standard-XML-Serializer. - Wenn du dagegen ggf. Sub-Element(e) erzeugen möchtest...
dann rufe deinen Code rekursiv auf und packe das "Innere" in einen Value-Knoten den du dem XML-Knoten unterordnest.
Es gibt auch diverse Schnittstellen die dich dabei unterstützen können, sofern diese von den benötigten Typen implementiert werden. Ganz allgemein und immer funktionierend wirst du das aber nicht gestalten können.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets - Wenn du nur Attribute und keine Elemente verwenden willst...
-
Hallo,
auch hier gilt: Eigengewächse vermeiden, vor allem wenn sie Ungemach bereiten und Objektorientierung vermissen lassen; hier vor allem, weil auf Innereien zurück gegriffen werden muss.
Es gibt IXmlSerializable Schnittstelle, die u. a. dazu gedacht ist einzelne Elemente speziell ausgeben zu können. Die nutzt z. B. der SQL Server um seine spezialisierten Datentypen zu (de)serialisieren.
Siehe zur Anwendung: Codeproject - How to Implement IXmlSerializable Correctly
In Deinem Fall könnte man dazu dann aus der generischen Klasse konkrete ableiten um die "erlaubten" Datentypen zu kontrollieren. Wobei Maßgabe dabei die primitiven Typen des XML Schemas sein kann.
Gruß Elmar
-
In Deinem Fall könnte man dazu dann aus der generischen Klasse konkrete ableiten um die "erlaubten" Datentypen zu kontrollieren. Wobei Maßgabe dabei die primitiven Typen des XML Schemas sein kann.
Hallo Elmar,
kannst das konkretisieren.
Serializable] public class PROPERTY<T> { [XmlAttribute] public T value { get; set; }
<ToDo> <!-- program to produce --> <PROGRAM value="testProgram" /> <!-- value 1 Träger 2 Einzelteil --> <UNIT value="2" /> </ToDo>
ich gebe zu, das wird recht komplex.
Es gibt nur 2 Datentypen int, string, double, evtl. mal.
Wie würde das Rekursive gehen?
Der Anstoß war der XML Kommentar, schade dass das nicht von Haus aus geht.
>•Wenn du dagegen ggf. Sub-Element(e) erzeugen möchtest...
>dann rufe deinen Code rekursiv auf und packe das "Innere" in einen
>Value-Knoten den du dem XML-Knoten unterordnest.[Serializable] public class PROPERTY<T> //: IXmlSerializable { [XmlAttribute] public T value { get; set; }
Müsste ich diese Klasse auch ableiten?Viele Grüße Sandra
- Bearbeitet Sandra Bauer Donnerstag, 28. Juli 2016 16:09 F
-
Hallo Sandra
wie schon angedeutet, halte ich das ganze Konzept für fragwürdig, was bei der Namensvergabe anfängt: Xml kennt keine "Property", sondern nur Entities bzw. Element und Attribute. Welche Vereinfachungen die Klasse bringen soll, ist mir schleierhaft und der Vorschlag von IXmlSerializable der Versuch wenigstens etwas Gliederung in das Chaos zu bringen.
Das "Aufblasen" von Xml Dokumenten mit Kommentaren, um die Inhalte zu beschreiben, sollte man ebenfalls bleiben lassen. Denn auch das Überlesen von Kommentaren kostet Zeit (um ein älteres Thema aufzugreifen) und ist wiederholt Platzverschwendung. Es gehört entweder in ein zugehöriges Xml Schema als Annotation oder aber es werden die konkreten Werte serialisiert (also anstatt "2" dann "Einzelteil"), was immer noch weniger Platz benötigt ist als gemischter Kommentarsalat.
"Vernünftiger" wäre der Einsatz von Klassen und dem Verwenden des XmlSerializers oder aber von Linq To Xml, was alle Elemente enthält, die man braucht, um ein Xml Dokument zu beschreiben (und beides funktioniert auch in beliebiger Verschachtelung).
Gruß Elmar
-
Hallo Elmar,
der Vorteil der Property<T> Klasse ist,
dass ich mir für jeden Eintrag, sprich Element eine eigene Klasse spare.
Sonst müsste ich immer eine Klasse mit Attribute value anlegen.Ja wie meist hast Du Recht.
Ich denke, wenn überhaupt 'normale' Serialisierung ohne Kommentare.
Was müsste ich jedoch tun, um zu serialisieren, diese Objektstruktur mit einer Schemadatei gegenprüfen
und dann zu schreiben.public void SerializeObject(string fileName, T dataObject) { using (var writer = XmlWriter.Create(fileName, WriterSettings)) { MySerializer.Serialize(writer, dataObject, Namespaces); } }
<?xml version="1.0" encoding="utf-8"?> <xs:schema id="PRINT" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="PROGRAM"> <xs:complexType> <xs:attribute name="value" type="xs:string" /> </xs:complexType> </xs:element> <xs:element name="NAME"> <xs:complexType> <xs:attribute name="value" type="xs:string" /> </xs:complexType> </xs:element> <xs:element name="QUANTITY"> <xs:complexType> <xs:attribute name="value" type="xs:int" /> </xs:complexType> </xs:element>
Über das XSD Tool erzeugte ich eine Schemadatei.
Grüße Sandra -
Hallo Sandra,
Dein XML entspricht hinsichtlich Benamsung und Aufbau nicht den Best Practices.
Wesentlich schöner würde es so aussehen:
<?xml version="1.0" encoding="utf-8"?> <Todo> <Program>testProgram</Program> <Name>WhiteEquipment</Name> <Quantity>1000</Quantity> <Actual>167</Actual> <Unit>2</Unit> <Countmethod>1</Countmethod> </Todo>
Attribute sollten nur sehr spärlich verwendet werden.
Das XML-Schema dazu sieht dann wie folgt aus:
<?xml version="1.0" encoding="utf-8"?> <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Todo" nillable="true" type="Todo" /> <xs:complexType name="Todo"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="1" name="Program" type="xs:string" /> <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" /> <xs:element minOccurs="1" maxOccurs="1" name="Quantity" type="xs:int" /> <xs:element minOccurs="1" maxOccurs="1" name="Actual" type="xs:int" /> <xs:element minOccurs="1" maxOccurs="1" name="Unit" type="xs:int" /> <xs:element minOccurs="1" maxOccurs="1" name="Countmethod" type="xs:int" /> </xs:sequence> </xs:complexType> </xs:schema>
Und daraus würde ich mit xsd.exe einfach eine serialisierbare Klasse erzeugen lassen:
[Serializable] public class Todo { [XmlElement] public string Program { get; set; } [XmlElement] public string Name { get; set; } [XmlElement] public int Quantity { get; set; } [XmlElement] public int Actual { get; set; } [XmlElement] public int Unit { get; set; } [XmlElement] public int Countmethod { get; set; } }
Dann kannst Du die Klasse XmlSerializer zum Serialisieren und Deserialisieren verwenden:
XmlSerializer serializer = new XmlSerializer(typeof(Todo)); Todo todo = (Todo) serializer.Deserialize(new FileStream("todo_in.xml", FileMode.Open)); serializer.Serialize(new FileStream("todo_out.xml", FileMode.Create), todo);
Am einfachsten geht es natürlich, wenn man direkt mit der Klasse anfängt.
-
Hallo Sandra,
Deine sogenannter Vorteil ergibt sich erst daraus, dass Du so ziemlich den ineffizientesten Aufbau verwendet hast, den man konstruieren kann.
Elemente mit einem Value Attribut sind besser als Element serialisiert, wie es Svens gutes Beispiel zeigt (und solltest es wirklich mal damit probieren).
Sollen es (aus Platzspargründen) Attribute sein, so würde man alles zum Attribut erklären und in einem einzigen Element serialisieren.
Um die Daten zu validieren siehe Validating an XML against referenced XSD in C#
Wobei das nur notwendig sein sollte, wenn die Daten von unterschiedlichen Programmen erzeugt und verarbeitet werden. Ansonsten sollte man die Konsistenz bereits beim Codieren sicher stellen können.
Gruß Elmar
-
Hallo Sven,
das ist halt die Vorgabe.
Mit dieser Struktur laufen die bisherigen Applikationen, diese kann ich nicht ändern.
Wie würdest Du es dann machen?
Grüße Sandra
<!-- program to produce --> <PROGRAM value="testProgram" /> <!-- value 1 Träger 2 Einzelteil --> <UNIT value="2" />
-
Hallo Sandra,
dem "Experten", der das verbockt hat, beauftragen, den passenden Serialisierer dafür zu schreiben ;)
Wie schon oft bei Deinen Fragen, kann man nur mit dem Kopf schütteln: Warum denkt niemand vorher nach? Die Folge ist immer wieder, dass alles andere später ein Mehr an Arbeit macht, als notwendig gewesen wäre. Hier:
Xml definiert ein Element so, dass der Inhalt ein Wert ist, warum musste man das "neu erfinden"?
Wenn das nicht zu ändern ist, so würde ich den Unfug nicht dadurch verschlimmern, dass ich die Informationen über eine nutzlosen Property<T> Klasse verwaltet, was wieder nur zusätzliche Programmieraufgaben bedeutet.
Nimm eine einfache simple Klasse (wie u. a. bei Sven zu sehen. Und schreibe den Serialisiervorgang selbst. Das ginge z. B. mit Linq To Xml ohne weitere Codewüste (wie sie oben bereits zu entstehen scheint).
Gruß Elmar
-
Hallo Elmar,das ganze wurde von meinem Vorgänger in C++,MFC erstellt.
Mein Chef will nun Teile mithilfe von C# umsetzen.
Dabei können wir nicht, neue Strukturen machen, da ja das Alte mit dem neuen gehen muss. Einfach als Hintergrund.
Die Idee mit dem Property war, dass ich den Datentyp bestimmen kann.Wie würdest Du das in dieser Konstellation umsetzen? Ob nun gut oder schlecht.
Eine Klasse für ACTUAL mit Attribute value
eine Klasse für COUNTMETHOD mit Attribute value
usw.So wie ich Dich verstanden habe, wenn nur ein Attribut, ein Wert, sprich Zuweisung wäre 1 Element ohne Attribut XML konformer.<ROOT> <ORDER> <ACTUAL value="0" /> <COUNTMETHOD value="1" /> <FINISHED value="0" /> <NAME value="Ruesten" /> <PROGRAM value="TestName" /> <QUANTITY value="1000" /> </ORDER> </ROOT>
Wenn dem so ist beiße ich bei meinem Chef auf Granit. So war es, so bleibt es.
Ich muss also das bestmögliche daraus machen. Da hilft kein Jammern und denke
es ist halt so.Viele Grüße Sandra
-
Hi Sandra,
Dein gezeigtes XML ist XML-konform und ergibt das folgende Schema. Welches Problem hast Du damit?--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen! Leben retten!
Wir essen Opa.
Wir essen, Opa. -
Hallo Sandra,
bitte verschone mich dem Gejammer... ich habe genug eigene Probleme, die ich aber nicht in den Welt tragen werde.
Wichtiger sollte sein, dass der Müll sich nicht im Neuen fortsetzt, denn dann kann man sich das Neuschreiben gleich sparen. Wie bereits geschrieben, kann man das z. B. mit IXmlSerializable oder mit Linq To Xml erledigen.
Für Linq (dauerte weniger als 15 Minuten, deutlich kürzer als die ganze Diskussion hier), auf Basis des XML aus dem ersten Beitrag:
public void TestToDoSerialize() { string fileName = @"C:\TEMP\TODO1.XML"; System.IO.File.Delete(fileName); var todo1 = new Todo() { Program = "Programm", Name = "Der Name", Quantity = 47, Actual = 42, Unit = 1, CountMethod = 2 }; todo1.Serialize(fileName); var todo2 = new Todo(); todo2.Deserialize(fileName); if (todo1.Program == todo2.Program && todo1.Name == todo2.Name && todo1.Quantity == todo2.Quantity && todo1.Actual == todo2.Actual && todo1.Unit == todo2.Unit && todo1.CountMethod == todo2.CountMethod) { Console.WriteLine("Todo's are equal"); } else { Console.WriteLine("Todo's are equal"); } } [Serializable] public class Todo { public string Program { get; set; } public string Name { get; set; } public int Quantity { get; set; } public int Actual { get; set; } public int Unit { get; set; } public int CountMethod { get; set; } public void Serialize(string fileName) { var doc = new XDocument(); doc.Add(new XElement("ToDo", new XElement("PROGRAM", new XAttribute("Value", Program ?? "")), new XElement("NAME", new XAttribute("Value", Name ?? "")), new XElement("QUANTITY", new XAttribute("Value", Quantity)), new XElement("ACTUAL", new XAttribute("Value", Actual)), new XElement("UNIT", new XAttribute("Value", Unit)), new XElement("COUNTMETHOD", new XAttribute("Value", CountMethod)))); doc.Save(fileName); } public void Deserialize(string fileName) { var doc = XDocument.Load(fileName); Program = (string)doc.Root.Element("PROGRAM").Attribute("Value"); Name = (string)doc.Root.Element("NAME").Attribute("Value"); Quantity = (int)doc.Root.Element("QUANTITY").Attribute("Value"); Actual = (int)doc.Root.Element("ACTUAL").Attribute("Value"); Unit = (int)doc.Root.Element("UNIT").Attribute("Value"); CountMethod = (int)doc.Root.Element("COUNTMETHOD").Attribute("Value"); } }
Da fehlen noch ein paar Fehlerbehandlungen, aber ansonsten muss man dabei nur einfach den Code runtertippen. Und das Ganze sollte auch von weniger begabten Programmierern später verstanden und änderbar sein.
Und im Programm selbst hat man es mit schlichten Pocos zu tun, ohne irgendwelche Handstände, die nur auf Grund des miserablen Xml entstehen und gewartet werden müssen.
Ähnlich ginge es mit IXmlSerializable, nur würde es etwas "kryptischer". Was sich lohnen könnte, wenn die Strukturen (Klassen) größer verschachtelt sind und man z. B. Elemente an unterschiedlichen Stellen im Dokument platzieren müsste. Aber auch XLinq bietet da einiges an Flexibilität.
Gruß Elmar
-
Hallo Peter,
[Serializable] public class PROPERTY<T> { [XmlAttribute] public T value { get; set; }
<ToDo> <!-- program to produce --> <PROGRAM value="testProgram" /> <!-- value 1 Träger 2 Einzelteil --> <UNIT value="2" /> </ToDo>
Die Ausgangslage war einfach, wie kann ich in einer Serialisierung eine XML Kommentar einfügen.
Das ist u.a. nicht so einfach, weil ich eine Klasse mit template verwende.
Das XML ist mit Attribute Value aufgebaut, dieses kann ich nicht ändern.Die Experten meinten XML Deklaration mit value sei schlecht.
Elmar war ja so nett, einen Vorschlag zu machen. DANKE.
Hintergrund ist einfach, ich wollte nicht für jedes Element eine Klasse erstellen.
Grüße Sandra -
Hi Sandra,
eine Demo zum Einfügen eines Kommentars beim Serialisieren habe ich unten beigefügt.Eine XML Deklaration mit value-Attribut ist erst einmal nicht schlecht. Das bedeutet aber, dass bei Nutzung der Standard-Serialisierung und -Deserialisierung jedes Element eine separate Klasse ist. Wenn Dir das nicht passt und Du es anders haben willst, musst Du einen Serializer selbst programmieren.
using System; using System.IO; using System.Linq; using System.Text; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; namespace ConsoleApplication1CS { class Program23 { static void Main(string[] args) { try { var d = new Program23Data() { Info = "TestText" }; XmlSerializer ser = new XmlSerializer(typeof(Program23Data)); MemoryStream str = new MemoryStream(); ser.Serialize(str, d); Console.WriteLine(Encoding.Default.GetString(str.ToArray())); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.Write("Fertig"); Console.ReadKey(); } } public class Program23Data : IXmlSerializable { [XmlComment("Hier der Kommentar.")] public string Info { get; set; } public void WriteXml(XmlWriter writer) { var properties = GetType().GetProperties(); foreach (var propertyInfo in properties) { if (propertyInfo.IsDefined(typeof(XmlCommentAttribute), false)) { writer.WriteComment( propertyInfo.GetCustomAttributes(typeof(XmlCommentAttribute), false) .Cast<XmlCommentAttribute>().Single().Comment); } writer.WriteElementString(propertyInfo.Name, propertyInfo.GetValue(this, null).ToString()); } } public XmlSchema GetSchema() { throw new NotImplementedException(); } public void ReadXml(XmlReader reader) { throw new NotImplementedException(); } } [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] public class XmlCommentAttribute : Attribute { public XmlCommentAttribute(String comment) { this.Comment = comment; } public string Comment { get; set; } } }
--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen! Leben retten!
Wir essen Opa.
Wir essen, Opa.- Als Antwort markiert Sandra Bauer Donnerstag, 4. August 2016 16:23
-
Hallo Peter,
Danke.
Soweit war ich schon mal, dann scheiterte das Vorhaben an meinem template.
Elmar fand die Lösung nicht gut, wenn's gehen würde, sehe ich es nicht als schlecht an.
Die Idee hoffe ich, hast Du verstanden.
Herkömmliche, normale Serialisierung.
Attribute und halt value, den value mag Elmar nicht.
Der value kann halt int, string, double sein. Ich würde mir da halt je eine Klasse mit Attribut sparen.
Wenn Du noch was weißt, sehr gerne, sonst müsste ich es wie Elmar meint umsetzen.
Viele Grüße Sandra
[XmlComment("Hier der Kommentar.")] public string Info { get; set; }
[XmlComment("Hier der Counter.")]
public PROPERTY<int> COUNTER;
[XmlComment("Hier der Name.")]
public PROPERTY<string> Name;
switch (type) { case "String": variableValueString = objectTypeForXmlComment as PROPERTY<string>; if (variableValueString.value != null) writer.WriteElementString(propertyInfo.Name, variableValueString.value.ToString()); break; case "Int32": variableValueInt = objectTypeForXmlComment as PROPERTY<int>; writer.WriteElementString(propertyInfo.Name, variableValueInt.value.ToString()); break; }
[Serializable] public class PROPERTY<T> { [XmlAttribute] public T value { get; set; }
-
Hallo,
da meine Meinung zählt nicht, folglich verstecke Dich nicht dahinter... Du solltest mal was tun, denn wir reden endlos über Kleinkram.
Wenn die (IMVHO überflüssigen) Kommentare sein müssen, kann man sie in der gezeigten Lösung als XComment ebenso einfügen wie ein XElement.
Genauso wie man den Code durch ein, zwei Methoden vereinfachen könnte, aber das überlasse ich Dir.
Umgekehrt: Verwendet man Reflection (die ebenso mit XElement möglich wäre), so muss man darauf achten, dass die Reihenfolge mit dem geforderten Schema übereinstimmt. Sonst klapperts am anderen Ende.
Gruß Elmar
- Als Antwort markiert Sandra Bauer Donnerstag, 4. August 2016 16:23
-
Hi Sandra,
Du bekommst ein XML mit einer Struktur, willst die Standardmethoden zur Deserialisierung nutzen und willst aber eine andere Objektstruktur erhalten. Wie soll das funktionieren?--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen! Leben retten!
Wir essen Opa.
Wir essen, Opa. -
da meine Meinung zählt nicht, folglich verstecke Dich nicht dahinter... Du solltest mal was tun, denn wir reden endlos über Kleinkram.
Wenn die (IMVHO überflüssigen) Kommentare sein müssen, kann man sie in der gezeigten Lösung als XComment ebenso einfügen wie ein XElement.
Genauso wie man den Code durch ein, zwei Methoden vereinfachen könnte, aber das überlasse ich Dir.
Hallo Elmar,
wie kommst Du darauf? Natürlich zählt Deine Meinung, ich bin jedem dankbar hier der mich unterstützt.
Viele Grüße Sandra