2009-02-19 8 views

Répondre

2

Modifier: s'il vous plaît clarifier, parlez-vous c# attributes ou des membres de votre classe? La seule façon d'ajouter des attributs C# est de générer une nouvelle classe avec les attributs supplémentaires, de compiler et de charger le nouvel assemblage dans votre AppDomain existant.

+0

Et par classe, il signifie un nouveau type, pas seulement une autre instance de la même classe. –

+0

@Joel tout à fait raison, je peux voir que cela pourrait être un peu ambigu. Merci –

1

Utilisez une hashtable pour stocker vos attributs.

Si vous voulez plus de souplesse d'exécution, vous pouvez essayer Ruby ou un autre langage interprété.

+0

s/interprété/dynamique /. Ruby, PHP et Python sont dynamiques. C#, Java et VB sont statiques. – strager

+0

@bill Je pense que vous voulez dire langage dynamique ... –

+0

Bien sûr - bon point. N'importe quelle langue peut être compilée et n'importe quelle langue peut être interprétée. Juste une étrange coïncidence que Ruby, PHP et Python sont généralement interprétés et que C#, Java et VB sont compilés ... –

0

Les attributs font partie des métadonnées d'un type et sont donc codés en dur dans l'assemblage compilé (c'est aussi la raison pour laquelle vous ne pouvez utiliser que des types primitifs et non des données arbitraires).

La conséquence est que vous ne pouvez pas ajouter d'attributs à un type lors de l'exécution. Mais il existe diverses techniques alternatives. Vous pouvez utiliser des dictionnaires simples ou quelque chose de plus puissant comme attached dependency properties.

9

Que faut-il voir les attributs? S'il est des choses comme etc de liaison de données, TypeDescriptor devrait fonctionner:

TypeDescriptor.AddAttributes(type, attribs); 
TypeDescriptor.AddAttributes(instance, attribs); 

Cela ne concerne que l'utilisation System.ComponentModel (pas de réflexion directe), mais qui est assez souvent - par exemple, vous pouvez associer un TypeConverter par ce qui précède.

Si par "attributs" vous voulez dire "propriétés", alors (encore une fois, en ce qui concerne la liaison de données) TypeDescriptor a également un potentiel - mais il est non-trivial; vous devez implémenter ICustomTypeDescriptor sur l'objet, ou écrire un CustomTypeDescriptor pour le type - et dans les deux cas, vous devez écrire votre propre implémentation PropertyDescriptor (en parlant souvent à un dictionnaire par instance, etc.). Cela habituera par tout ce qui utilise:

// only works if you use TypeDescriptionProvider 
PropertyDescriptorCollection typeProps = TypeDescriptor.GetProperties(type); 
// works via TypeDescriptionProvider or ICustomTypeDescriptor 
PropertyDescriptorCollection objProps = TypeDescriptor.GetProperties(obj); 

Encore une fois, cela couvre un large éventail de scénarios de liaison de données et similaires. Pour un exemple de ceci, see here - c'est loin d'être trivial, cependant. L'exemple d'utilisation (à partir du lien) ajoute deux propriétés à l'exécution:

Bag.AddProperty<int>("TestProp", new DefaultValueAttribute(5)); 
Bag.AddProperty<string>("Name"); 
Questions connexes