type tipos new create anonymoustype anonimos c# attributes anonymous-types

c# - tipos - ¿Puedo usar atributos con clases anónimas?



return dynamic type c# (3)

Tengo una clase anónima:

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

¿Hay alguna forma de adjuntar atributos a esta clase? Reflexión, otra? Realmente estaba esperando algo como esto:

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


En primer lugar, este es un tipo anónimo. La palabra "dinámica" podría llevar a la gente a pensar que estás hablando de una clase C # 4.0 implementando semántica dinámica, que no eres.

En segundo lugar, no, no puedes hacer lo que pides.

Si necesita especificar atributos para sus propiedades, regresa a un tipo con nombre, es decir. una clase o estructura normal.


En realidad estás creando lo que se llama un tipo anónimo aquí, no uno dinámico.

Desafortunadamente no, no hay forma de lograr lo que estás tratando de hacer. Los tipos anónimos están destinados a ser un tipo inmutable muy simple que consiste en pares de nombre / valor.

La versión C # de tipo anónimo solo le permite personalizar el conjunto de pares de nombre / valor en el tipo subyacente. Nada más. VB.Net permite un poco más de personalización ya que los pares pueden ser mutables o inmutables. Sin embargo, ninguno le permite aumentar el tipo con atributos.

Si desea agregar atributos, deberá crear un tipo completo.

EDIT OP preguntó si los atributos podrían agregarse mediante reflexión.

No, esto no se puede hacer. La reflexión es una forma de inspeccionar los metadatos no mutando. Por lo tanto, no se puede usar para agregar atributos.

Además, las definiciones de tipo en un ensamblado, y en general, son inmutables y no pueden ser mutados en tiempo de ejecución [1]. Esto incluye la adición de atributos a un método. Entonces, otras tecnologías similares a reflexiones tampoco pueden usarse aquí.

[1] La única excepción a esto es la operación ENC


Es posible agregar atributos a una instancia anónima utilizando TypeDescriptor.AddAttributes . Luego puede acceder a los atributos usando TypeDescriptor.GetAttributes .

Esto no los agregará a la instancia de Tipo para el objeto. Por lo tanto, puede no ser útil en su caso si no controla el código que recupera y aplica los atributos.