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
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.
Hallo THQ,
die Lösung ist doch offensichtlich. Mach die Attribut-Klasse generisch:
[Reload<DerGenerischeTyp>]
herbivore
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
trotzdem danke
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
Typeof geht ja logischerweise auch nicht mit den Generischen Typen
Was meinst du damit? Denn typeof(MyStore<>)
(ohne generischen Typparameter!) kannst du verwenden.
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
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?
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
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 🙁
@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.
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.
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
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.