Laden...

Liste mit Expression<Func<T, bool>> für unterschiedliche Ts...? [gelöst]

Erstellt von sth_Weird vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.115 Views
S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 7 Jahren
Liste mit Expression<Func<T, bool>> für unterschiedliche Ts...? [gelöst]

Hi,
ich habe mir eine GUI zum Anlegen von Filtern geschrieben. Jeder Filter ist definiert als Expression<Func<T, bool>>.
Nun möchte ich alle Filter in einer Liste speichern. Der Haken dabei: das T ist nicht bei allen Filtern der gleiche Datentyp, es kann also einmal Expression<Func<string, bool>> sein, ein anderes Mal Expression<Func<MyDataType, bool>>. Zusatzinfo: Nicht alle Filter sind für ein und dasselbe Ziel gedacht, daher sind die unterschiedlichen Datentypen kein Widerspruch.
Nun dachte ich mir, das einfachste ist, ich verwende als Datentyp object, da das ja die Oberklasse von allem ist.

List<Expression<Func<object, bool>>> myList;
...

Wenn ich nun aber Daten einfügen will:


Expression<Func<MyDataType, bool>> myExpression = ...;
// das geht nicht
myList.Add(myExpression);
// das geht auch nicht:
myList.Add((Expression<Func<object, bool>>)myExpression)

dann meckert der Compiler, er könne Expression<Func<MyDataType,bool>> nicht umwandeln in Expression<Func<object, bool>>.

A) Warum kommt hier diese Fehlermeldung, wo object doch die "Überklasse" ist. In eine List<object> kann ich ja auch alles adden.

B) Wie muss ich die Liste definieren bzw. wie meine Expression einfügen, damit es geht, oder ist die einzige Alternative (wenn ich mir keine eigene Listenklasse anlegen will...), die ganze Expression-Liste als List<object> anzulegen?

gruß & danke
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

T
2.224 Beiträge seit 2008
vor 7 Jahren

@sth_Weird
Es mag sein, dass object die Oberklasse aller Klassen ist.
Aber du versuchst hier, was der Compiler zu recht anmeckert, unterschiedliche Typen in die Liste zu packen.
Was su machen willst, klappt wegen der strengen Typisierung so nicht.

Für C# sind deine Expression<Func...> utnerschiedliche Typen.
Eine Mischung in einer Liste von unterschiedlichen Expressen Funcs wird nicht klappen.
Je nachdem wie dein Code augebaut ist, müsstest du ggf. eigene Listen pro Expression Typen anlegen und verwalten.
Dürfte aber ab einer bestimmten Menge ganz schön unübersichtlich werden.

Leider habe ich keine Lösung parat, dass ich diesen Fall noch nicht hatte.
Ober es überhaupt sinnvoll ist, deine Filter in einer Liste zu speichern, ist mir nicht ganz klar.
Gerade wegen der strengen Typisierung dürfte das zu vielen Problemen kommen.

T-Virus

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.

3.003 Beiträge seit 2006
vor 7 Jahren

Mach eine List<LambdaExpression> aus deiner myList.

Dass das dann funktioniert, erkaufst du dir allerdings damit, dass du bei der An/Auswertung des Filters die Signatur der Filtermethode wissen musst (damit du casten kannst).

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 7 Jahren

List<LambdaExpression> funktioniert, danke!

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+