Forums Neueste Beiträge
 

Fatale Folgen aufgrund Ändern der Reihenfolge mit Reflection

13/01/2010 - 10:00 von Peter Beerle | Report spam
Ich habe for Jahren unter .NET 1.1 mithilfe der Reflection eine
Kommunikationslibrary entwickelt, mit welcher ich mit 1 Schreibzyklus eine
beliebige Datenstruktur in ein ByteArray zerlege und als Blocktransfer über
eine Kommunikationsbibliothek auf eine SW-SPS transferieren kann.

Dies hat bis heute auch unter .NET 2.0 immer funktioniert.

Das Konzept beruhte darauf, dass ich in C# eine Klasse deklariere mit
Properties, deren Datentyp und Reihenfolge der Datenstruktur auf Seite SW-SPS
entspricht.
Ein Klasse hat dann z.B: eine erstes Property vom Typ int, ein zweites
Property vom Typ real usw. Dabei waren beliebige Strukturen, Arrays und
verschachtelungen möglich.

Mit Reflection habe ich meine Klasse durchlaufen und einfach die Properties
in ein Byte-Array abgefüllt und dann als Blocktranfer mit einer
Kommunikationsbibliothek zur SW-SPS als Byte-Array übertragen.

Gestern nun habe ich erstmalig nach Jahren festgestellt, dass das
Durchlaufen mit Reflection die Reihenfolge der Properties, die ich mit
GetFields() erhalte manchmal in umgekehrter Reihenfolge ergibt. Ich habe mich
eigentlich darauf verlassen und dies war by Design so, dass ich eben die
Reihenfolge der Deklaration in meiner Klasse genau so machen muss, wie sie in
der SW-SPS sind, damit ein Blocktransfer als ByteArray funktioniert. Wenn ich
mich nicht auf die deklarierte Reihenfolge verlassen kann, funktioniert das
Zerlegen als ByteArray nicht.

Ich habe in Google dann ach gelesen, dass im .NET-Framework 2.0 dies von
Microsoft by Design geàndert wurde, dass die Reflection bewusst nicht immer
dieselbe Reihenfolge liefert.

Mein Design und auch die Applikation die ich habe beruht nun mal auf diesem
Konzept und funktioniert offensichtlich nicht (mehr). Warum dieses Verhalten
nach Jahren und erstmalig auftritt bzw. welche Fehler sich in alle den bisher
ausgeliefterten Projekten sich ergeben ist völlig unklar.

Die aktuelle Applikation dreht die Reihenfolge beim ersten Start 1 x und
liefert künftig immer die richtige Reihenfolge (oder aber ich habe es bisher
noch nicht gemerkt, wann es wieder dreht).

Nun zu meiner Frage:
Das konzeptionelle àndern der Kommunkation ist derzeit weder zeitlich noch
vom Aufwand her machbar. Was kann ich dagegen tun ? Kann ich die mit
Reflection erhaltene Reihenfolge doch irgend wie bestimmen, dass isie
wenigstens immer gleich ist ? Kann man den Sourcecode dazu einsehen und
überladen, dass das gewollte Ändern der Reihenfolge doch gleich und
entsprechend der Deklaration ist ?

Was habe ich denn jetzt für andere Möglichkeiten, mit geringst möglichem
Aufwand nicht ganz von vorne ein neues Kommunikationskonzept zu erstellen ?
 

Lesen sie die antworten

#1 Joachim Fuchs
13/01/2010 - 11:22 | Warnen spam
Hallo Peter,

warum làdtst Du nicht mit GetField(name) die Felder alle einzeln? Dann
kannst Du die Reihenfolge selbst vorgeben.

Oder Du definierst Dir ein Attribut, das jeder Felddeklaration zugeordnet
wird und die Reihenfolge angibt. Danach sortierst Du dann die mit
GetFields() erhaltenen FieldInfo-Objekte.

Gruß
Joachim

Dr. Joachim Fuchs - Autor - Dozent - Softwarearchitekt
http://www.fuechse-online.de/beruflich/index.html

Ähnliche fragen