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
};
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top