Laden...

Im Konstruktor Liste<> vom beliebigen Type

Letzter Beitrag vor einem Jahr 6 Posts 678 Views
Im Konstruktor Liste<> vom beliebigen Type

Hallo!

Ich möchte von einem Konstruktor eine Liste von einem beliebige Type übernehmen und in die entsprechende typisierte Liste konvertieren:


#region Konstruktor
public Sortierung(List<object> myDatenListe, Type myDatenType, ...)
{
    List<myDatenType> MyDatenListe = (List<myDatenType>)myDatenListe;
    ...

List<object> myDatenListe ⇒ List<myDatenType> MyDatenListe

Keine Lösung aus dem Netz waren für Konstruktoren. Also ich kann jetzt nicht Sortierung<T>() machen.

Wie könnte man das umsetzen?

Klingt sehr komisch.
Brauchst du ggf. Generics?

Doku:
Generic classes and methods

Ansonsten musst du halt die Objekte einzeln casten, was aber sehr unschön ist.
Woher kommt den die Object Liste?
Ggf. solltest du schon vor dem Aufruf die Daten casten.

T-Virs

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

Ich möchte von einem Konstruktor eine Liste von einem beliebige Type übernehmen und in die entsprechende typisierte Liste konvertieren

Was ist denn der Use Case? Der Ansatz hört sich schon ungesund hat.
Macht kein Sinn Symptome zu fixen, wenns an der Wurzel nicht passt.

Hallo T-Virus, Hallo Abt!

So ungewöhnlich finde ich meine "Anforderung" gar nicht.

Zum Hintergrund ...

Ich programmiere eine universelle Klasse (DatenZugriff), welche Daten, genauer gesagt immer Listen eines UserType's: Filtert, Sortiert, Gruppiert, Suche mit Optionen ermöglicht usw..

Die hinter der Liste liegenden Methoden sind ja immer die gleichen, egal von welchem Type die Liste ist.

Die Felder des Type's lese ich per Reflektion aus und biete sie zur Auswahl z.B. beim Sortieren oder Suchen an.

Die DatenZugriffs-Klasse benötigt nur eine Liste<UserType> und den Type der Liste.
Diese Liste und den Listen-Type möchte ich nun im Konstruktor (der DatenZugriffs-Klasse) übergeben um sie innerhalb der DatenZugriff-Klasse wieder in die Liste<DatenType> zu konvertieren. Der genaue Listen-Type soll also "universell" sein.

Kurz gesagt, möchte ich nur die übergebene Liste wieder in die Liste des übergebenen Daten-Type's casten.

Kann mir nicht vorstellen, dass ich, wie es T-Virus andeutet, eine Instanz des Type's der Liste erzeugen und jeden Eintrag einzeln casten muss!!!???

Du hast wieder nur gesagt wie du etwas implementieren willst, nicht was das werden soll.
Dein Ansatz scheint schon etwas suboptimal gewählt, wenn du solche Verrenkungen machen willst/musst.

Hallo FZelle !

Ich habe mich lange Zeit gefragt, was möchte er denn noch wissen?

Ich möchte von einem Konstruktor eine Liste von einem beliebigen Type übernehmen und in die entsprechende typisierte Liste konvertieren.

List<myDatenType> MyDatenListe = (List<myDatenType>)myDatenListe;

Dahinter steht dann der Ansatz, dass ich die einzelnen Felder (dieses spezifischen Daten-Type's!) analysieren [Name und Type] und wieder listen [z.B. als (Feld) Auswahlliste für eine Sortierung] kann.

Inzwischen hat sich die gesamte Problematik erledigt, da die CollectionViewSource-Klasse in Verbindung mit der ICollectionView-Klasse mir die gesamte Arbeit abnimmt.

Dem Konstruktor übergebe ich (nun nur noch) die (spezifische) Liste als objekt.

#region Konstruktor
public Sortierung(object myDatenListe)
{ ...

Die CollectionViewSource.Source-Eigenschaft ist sowieso vom Type object und dieser übergebe ich die,vom Konstruktor übernommene, (objekt) Liste.

CvsDatenListe.Source = myDatenListe;

Aus der ICollectionView.ItemProperties-Auflistung kann ich dann alle spezifische Feld-Informationen (aus der als object übergebenen Liste) auslesen.

((ListCollectionView)MyDatenView).ItemProperties.ToList()

Grundprinzip: Im Konstruktor die Liste als object übergeben und per Reflection die spezifischen Eigenschaften des übergebenen Objekes auslesen.

Sorry, ich war davon ausgegangen das ich die Liste erst in den Ziel-Type konvertieren müsste um dann die spezifischen Eigenschaften auslesen zu können.

Vielen Dank für euer Interesse!