Laden...

Generischer Namespace als Returntyp?

Erstellt von Seikilos vor 15 Jahren Letzter Beitrag vor 15 Jahren 753 Views
S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 15 Jahren
Generischer Namespace als Returntyp?

Merkwürdige Frage, allerdings habe ich eine Methode, deren Signatur so aussieht:


public meinNs.MeinTyp foo();

Der Haken ist, es gibt sehr viele Namespaces, aber immer den Rückgabetyp MeinFoo.

Dh ich hätte eine Menge Methoden ala:


public meinNs.MeinTyp foo();
public meinNs2.MeinTyp foo();
public meinNs3.MeinTyp foo();

Methoden Körper wäre gleich, mein Ziel wäre, den Namespace als Template Parameter an die Funktion (nicht Klasse!) zu übergeben.

Ich glaube, es würde gehen, wenn die Methoden komplett generisch wären:


public T foo<T>();

Aber das würde ich sehr gerne vermeiden, da nun nicht mal ansatzweise klar ist, was der Rückgabetyp ist und man so vollkommen vom Aufrufenden abhängig ist

Life is a short

5.742 Beiträge seit 2007
vor 15 Jahren

Hallo Seikilos,

wenn die Typen keine gemeinsamen Interfaces implementieren, die die benötigte Funktionalität bereitstellen, sieht es schlecht für dich aus.

Aushelfen könntest du dir mit Reflection - der Stil wäre allerdings nicht unbedingt der beste.

Hast du dir schon mal das Fassaden-Muster (und ähnliche) angeschaut? Dann könntest du zumindest ein paar Redunanzen vermeiden.

630 Beiträge seit 2007
vor 15 Jahren

EDIT: Zu langsam ^^

Hallo Seikos,

du könntest jedes MeinTyp ein gemeinsames Interface implementieren lassen.

Dann könntest du den Typparameter mit where einschränken und hättest Gewissheit über den Rückgabeparameter:


public T foo<T>() where T: IMeinTyp; 
{ ... }

Gruss
tscherno

To understand recursion you must first understand recursion

http://www.ilja-neumann.com
C# Gruppe bei last.fm

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 15 Jahren

Wird schwierig bei 180 Klassen, da n Interface reinzuknallen

gibt es eigentlich einen brutalen Weg, etwas zu casten?

Life is a short

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 15 Jahren

Ich beschreibe mal mein Problem genauer:

Ich bekomme eine XSD geliefert, die beispielsweise diese XMLs generiert:


<root>
 <header>...</header>
 <elementA />
</root>
// oder
<root>
 <header>...</header>
 <elementB />
</root>
....

Dh also einige Teile der XML wiederholen sich immer, wie der header, andere Elemente sind optional, also header und elementA oder header und elementB usw.

Mein Vorhaben funktionierte so:
Mittels XSD generiere ich Klassen aus der XSD, diese haben den Namespace "aa". Arbeite mit den Klassen ganz normal und serialisiere diese Klassen dann wieder.

Dabei benutze ich Methoden zur Generierung der Elemente, Beispiel:


public aa.RootType createRoot(){createHeader(); createElementA();...}
public aa.HeaderType createHeader();
public aa.ElementAType createElementA();

Man beachte den Namespace. Ich habe dann ein RootType, welches ich mittels dem XML Serializer in eine saubere XML umwandeln kann. Dies funktioniert einwandfrei.

Nun ist der Fall eingetreten, dass ich weitere XSD bekomme, Beispielsweise:


<root>
 <header>...</header>
 <ganzNeuesElementA/>
</root>

D.h. eine XSD bei der völlig neue Elemente hinzu kommen, teilweise sehr viele in vielen verschiedenen Abstufungen.
Das Problem nun, ich bekomme daraus mit xsd.exe wieder Klassen, mit dem Namespace bb.

Das Problem: Einige Elemente wie createHeader sind absolut gleich, außer dass der Namespace von aa auf bb gewechselt werden muss, diese Redundanz möchte ich dringend vermeiden.

Wie kann ich dieses Problem angehen? Es gibt in beiden Fällen ein RootType, der gleich aufgebaut ist und es gibt ein HeaderType. Diese dürfen aber nicht vom unterschiedlichen Namespace sein, da der Serializer dies nicht mitmacht.
Von aa.RootType nac bb.RootType kann C# offensichtlich nicht casten (habs probiert)

Eine Lösung wäre: Die Redundanz zu erzeugen, wobei ich wirklich äußert viele Kopien dieser Methoden hätte.

Eine andere Lösung ist nicht praktikabel: Beide XSD Dateien zu mergen. Es sind immer Änderungen, die 500-1000 Zeilen umfassen (nicht meine Idee), dies auch noch an verschiedenen Stellen.

Ihr seht nun mein Dilemma. Ich finde keinen klugen Weg aus dieser Sache.

Life is a short

3.971 Beiträge seit 2006
vor 15 Jahren

Eventuell selbst ein Tool entwerfen, das intern xsd.exe aufruft aber im nachinhein den Code mittels Regex bearbeitet und entsprechende Interfaces zu den Klassen hinzufügt. Eventuell sogar eine entsprechende Factory

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...