Identische Attribute für verschiedene Eigenschaften: Wie konsolidieren?

20/02/2010 - 11:22 von Christian Treffler | Report spam
Hi,

Ich verwende die gleiche Liste von Attributen für Eigenschaften
verschiedener Klassen.

Hier ist ein Ausschnitt aus dem Code:

################################################
public class QSM_Algorythm            
    {   // Die folgende Attribut-Liste wiederholt sich in
// anderen Klassen.
// Alle Typen sind von QSM_Algorythm_Base abgeleitet
        [XmlArrayItem(("Command"),  typeof(BCCommand))]
        [XmlArrayItem(("Loop"),     typeof(QSM_Loop))]
        [XmlArrayItem(("If"),       typeof(QSM_If))]
        [XmlArrayItem(("SRecord"),  typeof(QSM_SRec))]
        [XmlArrayItem(("Log"),      typeof(QSM_Log))]
        [XmlArray("CommandFlow")]
        public List<QSM_Algorythm_Base> TestFlow;

// ... alle weiteren Methoden und Eigenschaften
}

public class QSM_If
    { // Genau die gleiche Liste, wie oben
        [XmlArrayItem(("Command"), typeof(BCCommand))]
        [XmlArrayItem(("Loop"), typeof(QSM_Loop))]
        [XmlArrayItem(("If"), typeof(QSM_If))]
        [XmlArrayItem(("SRecord"), typeof(QSM_SRec))]
        [XmlArrayItem(("Log"), typeof(QSM_Log))]
        [XmlArray("CommandFlowIf")]
        public List<QSM_Algorythm_Base> TestFlowIf;
 
// ... alle weiteren Methoden und Eigenschaften
}
###############################################

Die Klassen werden mit XmlSerializer serialisiert und deserialisiert.
Deshalb die Liste von Attributen.

Das Programm funktioniert tadellos.
Was mir nicht gefàllt, ist die Wiederholung der gleichen Liste von
Attributen an verschiedenen Stellen. Bei der Weiterentwicklung des Codes
wird sie sich nochmal wiederholen. Manchmal wird es nötig sein, ein
weiteres XmlArrayItem einzufügen, was dann überall geschehen muss.
Das ist ein Bug, der darauf wartet, zuzuschlagen.

Hier kàmen #define Makros, wie man sie in C kennt, gerade recht. Aber C#
bietet das nicht an.

Gibt es einen Weg, die Liste von Attributen nur einmal im Code
festzulegen und in jeder Klasse anzuwenden?

Auf die Möglichkeit von Attribut Klassen wurde ich bereits hingewiesen.
Aber ich sehe keinen Weg, eine Attribut Klasse von XmlArrayItem
abzuleiten und statt einem einzelnen ElementName/Type Paar eine ganze
Liste von Paaren zu übergeben.

Kennt jemand ein Lösung?

TIA,
Christian

 
 

Lesen sie die antworten

#1 Frank Dzaebel
20/02/2010 - 13:05 | Warnen spam
Hallo Christian,

Ich verwende die gleiche Liste von Attributen für Eigenschaften
verschiedener Klassen. [...]
Was mir nicht gefàllt, ist die Wiederholung der gleichen Liste von
Attributen an verschiedenen Stellen.



Nun, einer der vorgesehenen Wege ist, die Attribute
zur Laufzeit vor dem Serialisierungs-Vorgang
zu injizieren. Zum Beispiel hat der Ctor des XmlSerializer's
in einigen Überladungen auch den XmlAttributeOverrides-
Parameter:

[XmlAttributeOverrides-Klasse (System.Xml.Serialization)]
http://msdn.microsoft.com/de-de/lib...rides.aspx

[XmlAttributes.XmlArray-Eigenschaft (System.Xml.Serialization)]
http://msdn.microsoft.com/de-de/lib...array.aspx

Diese zusàtzlichen Attribute kann man dann noch relativ
sauber und dennoch flexibel zum Beispiel über Nutzung
von Reflection setzen. (Typ-, oder Interface-Queries).
__________

Wenn es trotzdem unbedingt über eine Code-Automatik
gehen soll, eigenen sich ggf. T4 Templates:

[Scott Hanselman's Computer Zen - T4 (Text Template Transformation
Toolkit) Code Generation - Best Kept Visual Studio Secret]
http://www.hanselman.com/blog/T4Tex...ecret.aspx

oder Assembly Enhancing (->PostBuild) oder Reflection.Emit.



Hier kàmen #define Makros, wie man sie in C kennt,
gerade recht. Aber C# bietet das nicht an.



Das leistet aber eher unsauberer Copy/Paste-Vererbung
Vorschub.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen