Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Generics mit Attributen
THQ
myCSharp.de - Member



Dabei seit:
Beiträge: 68

Themenstarter:

Generics mit Attributen

beantworten | zitieren | melden

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

Moderationshinweis von herbivore (16.05.2011 - 08:49)

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.

private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo THQ,

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

[Reload<DerGenerischeTyp>]

herbivore
private Nachricht | Beiträge des Benutzers
THQ
myCSharp.de - Member



Dabei seit:
Beiträge: 68

Themenstarter:

beantworten | zitieren | melden

Danke für die Antwort.
Ich glaube dies kann ich mir aus dem Kopf schlagen, da es bei C# anscheinend nicht erlaubt ist:
Fehler
"<" unerwartet: Attribute können nicht generisch sein

Compilerfehler CS0404


trotzdem danke
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 2.891

beantworten | zitieren | melden

Zitat von THQ
Typeof geht ja logischerweise auch nicht mit den Generischen Typen
Was meinst du damit? Denn typeof(MyStore<>) (ohne generischen Typparameter!) kannst du verwenden.
private Nachricht | Beiträge des Benutzers
THQ
myCSharp.de - Member



Dabei seit:
Beiträge: 68

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 2.891

beantworten | zitieren | melden

Zitat von herbivore
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]
Zitat von THQ
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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dN!3L am .
private Nachricht | Beiträge des Benutzers
THQ
myCSharp.de - Member



Dabei seit:
Beiträge: 68

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von THQ am .
private Nachricht | Beiträge des Benutzers
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1.815
Herkunft: NRW

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 2.891

beantworten | zitieren | melden

@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.
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 2.891

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
zero_x
myCSharp.de - Member

Avatar #avatar-2567.gif


Dabei seit:
Beiträge: 1.044
Herkunft: Koblenz

beantworten | zitieren | melden

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 | myCSharp.de - gemeinsam mehr erreichen

Für längere Zeit inaktiv.
private Nachricht | Beiträge des Benutzers