Gli attributi possono essere aggiunti dynamicmente in C #?

È ansible aggiungere attributi in fase di esecuzione o modificare il valore di un attributo in fase di esecuzione?

Gli attributi sono metadati statici. Assiemi, moduli, tipi, membri, parametri e valori di ritorno non sono oggetti di prima class in C # (ad esempio, la class System.Type è semplicemente una rappresentazione riflessa di un tipo). È ansible ottenere un’istanza di un attributo per un tipo e modificare le proprietà se sono scrivibili ma ciò non influirà sull’attributo in quanto viene applicato al tipo.

Questo dipende molto da cosa esattamente stai cercando di ottenere.

Il materiale System.ComponentModel.TypeDescriptor può essere utilizzato per aggiungere attributi a tipi, proprietà e istanze di oggetti e ha la limitazione che è necessario utilizzarlo per recuperare anche tali proprietà. Se stai scrivendo il codice che consuma quegli attributi e puoi vivere entro tali limiti, allora lo consiglierei sicuramente.

Per quanto ne so, il controllo PropertyGrid e la superficie di progettazione dello studio visivo sono le uniche cose nel BCL che consumano il materiale TypeDescriptor. In effetti, è così che fanno circa la metà delle cose che devono davvero fare.

Beh, per essere diverso, ho trovato un articolo che fa riferimento a Reflection.Emit per farlo.

Ecco il link: http://www.codeproject.com/KB/cs/dotnetattributes.aspx , dovrai anche esaminare alcuni dei commenti in fondo all’articolo, poiché vengono discussi i possibili approcci.

Non puoi Una soluzione alternativa potrebbe essere quella di generare una class derivata in fase di runtime e aggiungere l’attributo, sebbene questo sia probabilmente un po ‘eccessivo.

No non lo è.

Gli attributi sono meta-dati e memorizzati in forma binaria nell’assieme compilato (è anche per questo che puoi usare solo tipi semplici in essi).

Non ci credo. Anche se sbaglio, il meglio che puoi sperare è aggiungerli a un intero Tipo, mai un’istanza di un Tipo.

Se hai bisogno di qualcosa da aggiungere dynamicmente, gli attributi c # non sono la via. Cerca nella memorizzazione dei dati in xml. Recentemente ho fatto un progetto che ho avviato con gli attributi, ma alla fine è passato alla serializzazione w / xml.

Perché hai bisogno? Gli attributi forniscono informazioni aggiuntive per la riflessione, ma se sai esternamente quali proprietà vuoi non hai bisogno di loro.

È ansible archiviare i metadati esternamente in modo relativamente semplice in un database o in un file di risorse.

Ho provato molto duro con System.ComponentModel.TypeDescriptor senza successo. Ciò non significa che non può funzionare, ma mi piacerebbe vedere il codice per questo.

In contro parte, volevo cambiare alcuni valori di Attributo. Ho fatto 2 funzioni che funzionano bene per quello scopo.

  // ************************************************************************ public static void SetObjectPropertyDescription(this Type typeOfObject, string propertyName, string description) { PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName]; var att = pd.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute; if (att != null) { var fieldDescription = att.GetType().GetField("description", BindingFlags.NonPublic | BindingFlags.Instance); if (fieldDescription != null) { fieldDescription.SetValue(att, description); } } } // ************************************************************************ public static void SetPropertyAttributReadOnly(this Type typeOfObject, string propertyName, bool isReadOnly) { PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName]; var att = pd.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute; if (att != null) { var fieldDescription = att.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); if (fieldDescription != null) { fieldDescription.SetValue(att, isReadOnly); } } } 

In Java mi sono abituato a lavorare su questo utilizzando una mappa e implementando la mia personale interpretazione della codifica Key-Value.

http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html