42 votes

Puis-je utiliser des attributs avec des classes anonymes?

J'ai une classe anonyme:

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

Existe-t-il de toute façon d'attacher des attributs à cette classe? Réflexion, autre? J'espérais vraiment quelque chose comme ça:

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

50voto

JaredPar Points 333733

Vous êtes en train de créer ce qui est appelé un type anonyme ici, pas dynamique.

Malheureusement non, il n'est pas possible de réaliser ce que vous essayez de faire. Anonyme types sont conçus pour être très simple immuable type de composé de paires nom / valeur.

La version C# de type anonyme ne permet de personnaliser le jeu de paires nom / valeur sur le type sous-jacent. Rien d'autre. VB.Net permet un peu plus de personnalisation, que les paires peuvent être mutables ou immuable. Ni vous permettent d'augmenter le type avec des attributs bien.

Si vous souhaitez ajouter des attributs que vous aurez besoin pour créer un type complet.

EDIT OP demandé si les attributs pourraient être ajoutés par le biais de la réflexion.

Non ce ne peut pas être fait. La réflexion est une façon de l'inspection des métadonnées mutation il. Par conséquent, il ne peut pas être utilisé pour ajouter des attributs.

En outre, les définitions de type dans une assemblée, et, en général, sont immuables et ne peut pas être muté à l'exécution [1]. Cela inclut l'ajout d'attributs à une méthode. Ainsi, les autres à la réflexion, comme les technologies ne peuvent pas être utilisées ici.

[1] La seule exception à cela est ENC opération

9voto

Lasse V. Karlsen Points 148037

Tout d'abord, il s'agit d'un type anonyme. Le mot "dynamique" pourrait amener les gens à penser que vous parlez d'une classe C # 4.0 implémentant la sémantique dynamique, ce que vous n'êtes pas.

Deuxièmement, non, vous n'êtes pas en mesure de faire ce que vous demandez.

Si vous devez spécifier des attributs pour vos propriétés, vous revenez à un type nommé, c.-à-d. une classe ou une structure normale.

8voto

Brent M. Spell Points 1414

Il est possible d'ajouter des attributs à un anonyme instance à l'aide de TypeDescriptor.AddAttributes. Vous pourrez ensuite accéder aux attributs à l'aide de TypeDescriptor.GetAttributes.

Ce ne sera pas ajouter le Type de l'instance de l'objet. Donc il peut ne pas être utile dans votre cas, si vous ne contrôlez pas le code qui récupère et applique les attributs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X