2009-08-01 21 views
37

Ho una classe anonima:Posso usare gli attributi con le classi anonime?

var someAnonymousClass = new 
{ 
    SomeInt = 25, 
    SomeString = "Hello anonymous Classes!", 
    SomeDate = DateTime.Now 
}; 

Esiste un modo per collegare gli attributi a questa classe? Riflessione, altro? Speravo davvero in qualcosa del genere:

var someAnonymousClass = new 
{ 
    [MyAttribute()] 
    SomeInt = 25, 
    SomeString = "Hello anonymous Classes!", 
    SomeDate = DateTime.Now 
}; 

risposta

45

In realtà stai creando quello che viene chiamato un tipo anonimo qui, non dinamico.

Purtroppo non c'è modo di ottenere ciò che si sta tentando 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 solo di personalizzare l'insieme di coppie nome/valore sul tipo sottostante. Nient'altro. VB.Net consente un po 'più di personalizzazione in quanto le coppie possono essere mutevoli o immutabili. Tuttavia non ti permettono di aumentare il tipo con gli attributi.

Se si desidera aggiungere attributi, è necessario creare un tipo completo.

EDIT OP ha chiesto se è possibile aggiungere gli attributi tramite riflessione.

No, non è possibile. La riflessione è un modo di ispezionare i metadati senza mutarli. Quindi non può essere utilizzato per aggiungere attributi.

Inoltre, digitare le definizioni in un assieme e, in generale, non sono modificabili e non possono essere mutate in fase di runtime [1]. Ciò include l'aggiunta di attributi a un metodo. Anche qui non è possibile utilizzare altre tecnologie simili a riflessioni.

[1] L'unica eccezione a questa è operazione ENC

9

Prima di tutto, questo è un tipo anonimo. La parola "dinamico" 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, vale a dire. una classe o una struttura normale.

+0

Hai ragione, intendevo il tipo Anon, grazie per il chiarimento. – will

7

E 'possibile aggiungere attributi a un'istanza anonima utilizzando TypeDescriptor.AddAttributes. Successivamente è possibile accedere agli attributi utilizzando TypeDescriptor.GetAttributes.

Questo non li aggiungerà all'istanza Digitare per l'oggetto. Quindi potrebbe non essere utile nel tuo caso se non controlli il codice che recupera e applica gli attributi.

+0

Nota: questo aggiunge gli attributi a livello di classe, NON gli attributi a livello di proprietà menzionati nell'esempio nella domanda. – DeepSpace101

Problemi correlati