En tant que classe d'entité, je souhaite ajouter un attribut à l'exécution, comment faire?C#: comment ajouter un attribut à un objet lors de l'exécution?
Répondre
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.
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é.
s/interprété/dynamique /. Ruby, PHP et Python sont dynamiques. C#, Java et VB sont statiques. – strager
@bill Je pense que vous voulez dire langage dynamique ... –
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 ... –
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.
Jetez un coup d'œil au Dynamic Language Runtime. Vous pourriez également envisager une langue dynamique comme IronRuby ou IronPython.
Quel problème tentez-vous de résoudre?
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");
j'aller avec PostSharp, un AOP framework très élégant (ou politique injection).
PostSharp allows you to inject custom attributes.
L'entrée de blog mentionnée dans le message contient du code que vous pouvez télécharger pour atteindre votre objectif.
Ce poste a répondu pour moi:
- 1. Comment ajouter un attribut à un élément XmlArray (XML Serialization)?
- 2. VB.NET Comment ajouter un attribut de retour?
- 3. Comment ajouter un attribut à un noeud XML sérialisé?
- 4. structure en C- pour ajouter un attribut à l'exécution?
- 5. Ajouter un élément à un objet jquery
- 6. Ajouter un attribut XML Namespace à un fichier XML tiers?
- 7. comment ajouter à un objet avec innerHTML
- 8. Ajouter un attribut de catégorie à un PropertyDescriptor
- 9. Html/Javascript: Ajouter un attribut à un contrôle HTML
- 10. Ajouter un attribut à un nœud xml avec nant
- 11. Comment puis-je ajouter un attribut à une valeur de retour dans C++/CLI?
- 12. Comment ajouter un objet IDisposable + delegate à une classe existante
- 13. Comment définir un attribut lors de la création d'un objet ActiveRecord?
- 14. Comment ajouter un espace de noms à un attribut dans lxml
- 15. Javascript pour ajouter un attribut personnalisé à certains éléments
- 16. comment puis-je ajouter un autre objet à un objet IQueryable déjà défini?
- 17. C# Comment redescendre un objet
- 18. Comment ajouter un fichier cs à un projet C# existant?
- 19. Lors de la sérialisation d'une collection générique personnalisée en XML, comment ajouter un attribut à l'élément de collection généré
- 20. Comment appliquer un attribut .net à un type de retour
- 21. Comment puis-je ajouter un attribut de classe à un élément HTML généré par les HTML Helpers de MVC?
- 22. C#: Comment DateTime.Now peut-il être juste un attribut?
- 23. Comment ignorer un attribut [XMLIgnore]
- 24. Comment ajouter un élément au tableau C++?
- 25. Comment puis-je ajouter un noeud enfant à un élément dans un objet DOM?
- 26. C#: Comment utiliser l'opérateur de distribution implicite lors de la conversion d'un objet en un type?
- 27. Comment ajouter un type de document à un XDocument?
- 28. Comment ajouter un utilisateur à AD à l'aide de System.DirectoryServices.AccountManagement?
- 29. comment définir un widget dans un modèle attribut
- 30. Comment lier un DataGridViewComboBoxColumn à un objet?
Et par classe, il signifie un nouveau type, pas seulement une autre instance de la même classe. –
@Joel tout à fait raison, je peux voir que cela pourrait être un peu ambigu. Merci –