Laden...

Generics mit Attributen

Erstellt von THQ vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.628 Views
T
THQ Themenstarter:in
68 Beiträge seit 2011
vor 12 Jahren
Generics mit Attributen

Guten Morgen,
ich arbeite immer noch an meinem "kleinen" Cache. Nun bin ich bei der Thematik angekommen, die versch. Stores miteinander zu verbinden. Sprich wird ein Eintrag in Store A geändert und zeigt auf Daten im Store B. So müssen die Datensätze auf die Verwiesen wird in Store B neugeladen werden, sofern diese geladen ist.

Nun zu er Problematik. Meine Hauptklasse hat folgenden Kopf:

public abstract class MyStore<Typ> : ObservableCollection<Typ> { }

Wie es bekannt ist, funktionieren bei Attributen keine Generics. Ich muss jedoch irgendwie den Typ speichern.
z.B.

[Reload(CacheTyp = DerGenerischeTyp)]

Da ich im späteren Verlauf, auf die oben genannte Klasse Casten muss mit dem Typen.
Typeof geht ja logischerweise auch nicht mit den Generischen Typen.

Wie kann ich das Problem lösen? Mir fällt dazu gerade absolut nichts ein.

mfg thq

Hinweis von herbivore vor 12 Jahren

Der Cache und das Lazy-Loading sollte in diesem Thread hier kein Thema sein. Das wird bereits in Wie damit umgehen, dass zunächst nur ein kleiner Teil der Daten und der Rest bei Bedarf geladen wird behandelt. Bei Bedarf also dort.

Bitte verwendet für C#-Code [****CSHARP]- statt [****CODE]-Tags ==> geändert.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo THQ,

die Lösung ist doch offensichtlich. Mach die Attribut-Klasse generisch:

[Reload<DerGenerischeTyp>]

herbivore

T
THQ Themenstarter:in
68 Beiträge seit 2011
vor 12 Jahren

Danke für die Antwort.
Ich glaube dies kann ich mir aus dem Kopf schlagen, da es bei C# anscheinend nicht erlaubt ist:

Fehlermeldung:
"<" unerwartet: Attribute können nicht generisch sein

Compilerfehler CS0404

trotzdem danke

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo THQ,

sorry, für mich war das - wie geschrieben - so offensichtlich, dass ich es nicht extra ausprobiert hatte. Dass Attribute nicht generisch sein dürfen, finde ich sehr verblüffend.

herbivore

2.891 Beiträge seit 2004
vor 12 Jahren

Typeof geht ja logischerweise auch nicht mit den Generischen Typen

Was meinst du damit? Denn typeof(MyStore<>) (ohne generischen Typparameter!) kannst du verwenden.

T
THQ Themenstarter:in
68 Beiträge seit 2011
vor 12 Jahren

Hallo,
auf diese Idee bin ich auch schon gestoßen, allerdings kann ich später im Verlauf dies nicht als generischen Typen nutzen, um dem Store den richtigen Typen zu übergeben.

mfg

2.891 Beiträge seit 2004
vor 12 Jahren

Dass Attribute nicht generisch sein dürfen, finde ich sehr verblüffend.

Die CLI verbietet auch nicht, dass Attribute generisch sind (siehe auch Why does C# forbid generic attribute types?). Der Grund ist wohl folgender:

Zitat von: Why does C# forbid generic attribute types? - Stack Overflow
Answer from Eric Lippert (paraphrased): no particular reason, except to avoid complexity in both the language and compiler for a use case which doesn't add much value.

[nop][/nop]

allerdings kann ich später im Verlauf dies nicht als generischen Typen nutzen, um dem Store den richtigen Typen zu übergeben.

Hä? Was hättest du denn nun gern alles im Attribut?
Du willst nicht [Reload(CacheTyp = typeof(MyStore<KonkreterTyp>))] und nicht [Reload(CacheTyp = typeof(MyStore<>))] schreiben. Was denn dann?

T
THQ Themenstarter:in
68 Beiträge seit 2011
vor 12 Jahren

Ich versuche mal anhand eines Beispiels. Vllt. ist mein Ansatz auch falsch.

Ich habe einen Store A. Dieser hat ein Attribut wo der Generische Typ enthalten ist, welcher der Store B benutzt. Es sozusagen eine einfache relation zwischen den zweichen.

Wenn ein Eintrag in Store A geändert wurde und gespeichert worden ist, so gehe ich via Reflection durch die Klasse im Store A und suche das Mitglied mit diesem bestimmten Attribut.

Wenn ich dieses Attribut gefunden habe, so benötige in den generischen Typen um auf meinen Store B zugriff zu bekommen. Der Zugriff sieht in etwa so aus:

(Cache.Cache.Instance.GetStore("Holiday";) as AbstractStore<Holiday>;).Remove(res.item, (CacheResult<Holiday> res2) => {
Debug.WriteLine("Entfernen ging";);
});

An dieser Stelle brauche ich den generischen Typen "Holiday" von dem Store A.

mfg

1.820 Beiträge seit 2005
vor 12 Jahren

Hallo!

@THQ:
Hab's gerade mal ausprobiert: typeof(List<string>) funktioniert, sollte also für alle generischen Typen gelten.

Nobody is perfect. I'm sad, i'm not nobody 🙁

2.891 Beiträge seit 2004
vor 12 Jahren

@THQ: Sorry, ich kann das nicht genau nachvollziehen. Kannst du das noch etwas konkreter machen?
Und erkläre nun auch mal bitte, welche Informationen du nun genau im Attribut brauchst. Denn momentan kann ich nicht erkennen, was du da nicht unterbringen kannst.

2.891 Beiträge seit 2004
vor 12 Jahren

Noch als kleine Ergänzung (zufällig gerade drüber gestolpert):

Zitat von: Mads Torgersen
Generic attributes are frequently requested, and are a very sensible feature to be wanting! The only problem is that we cannot represent generic attributes in metadata so they are very hard for us to implement. Stupid legacy reason, but there you have it.

One thing we could do (and have on our list to consider) is to at least allow generic abstract Attributes. Then you'd still have to create your own concrete classes instantiating them ,but it'd still be useful.

1.044 Beiträge seit 2008
vor 12 Jahren

Hallo THQ,

es war schon länger her, da habe ich mir auch die Frage gestellt. Nach langem Grübeln habe ich auf den Seiten von Microsoft Connect meine Frage eingestellt. Was darauf wird, weiß ich nicht. Die Fragt gehört aber zu häufig gestellten Fragen. Ich kann mir durchaus vorstellen, dass es in den kommenden Versionen von C# (/.NET) hinzugefügt wird. Das nur mal so am Rande.

zero_x