Posso usare gli attributi con le classi anonime?
-
10-07-2019 - |
Domanda
Ho una classe anonima:
var someAnonymousClass = new
{
SomeInt = 25,
SomeString = "Hello anonymous Classes!",
SomeDate = DateTime.Now
};
Esiste un modo per associare gli attributi a questa classe? Riflessione, altro? Speravo davvero qualcosa del genere:
var someAnonymousClass = new
{
[MyAttribute()]
SomeInt = 25,
SomeString = "Hello anonymous Classes!",
SomeDate = DateTime.Now
};
Soluzione
In realtà stai creando quello che viene chiamato un tipo anonimo qui, non dinamico.
Sfortunatamente no, non c'è modo di ottenere ciò che stai cercando di fare. I tipi anonimi sono pensati per essere un tipo immutabile molto semplice costituito da coppie nome / valore.
La versione C # di tipo anonimo consente di personalizzare solo l'insieme di coppie nome / valore sul tipo sottostante. Nient'altro. VB.Net consente una personalizzazione leggermente maggiore in quanto le coppie possono essere mutabili o immutabili. Nessuno dei due consente tuttavia di aumentare il tipo con gli attributi.
Se si desidera aggiungere attributi, è necessario creare un tipo completo.
EDIT OP ha chiesto se gli attributi potessero essere aggiunti tramite la riflessione.
No, questo non può essere fatto. La riflessione è un modo per ispezionare i metadati senza mutarlo. Quindi non può essere usato per aggiungere attributi.
Inoltre, digitare le definizioni in un assembly e, in generale, sono immutabili e non possono essere mutate in fase di esecuzione [1]. Ciò include l'aggiunta di attributi a un metodo. Quindi anche altre tecnologie di riflessione non possono essere utilizzate qui.
[1] L'unica eccezione a questa è l'operazione ENC
Altri suggerimenti
Prima di tutto, questo è un tipo anonimo. La parola "dinamica" potrebbe indurre le persone a pensare che stai parlando di una classe C # 4.0 che implementa la semantica dinamica, cosa che non sei.
In secondo luogo, no, non sei in grado di fare ciò che chiedi.
Se è necessario specificare gli attributi per le proprietà, si torna a un tipo denominato, ad es. una classe o struttura normale.
È possibile aggiungere attributi a un'istanza anonima utilizzando TypeDescriptor.AddAttributes . È quindi possibile accedere in seguito agli attributi utilizzando TypeDescriptor.GetAttributes .
Questo non li aggiungerà all'istanza Tipo per l'oggetto. Pertanto, potrebbe non essere utile nel tuo caso se non controlli il codice che recupera e applica gli attributi.