2009-08-01 16 views
37

Tengo una clase anónima:¿Puedo usar atributos con clases anónimas?

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

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

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

Respuesta

45

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

Desafortunadamente, no hay forma de lograr lo que está 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# del 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 quiere agregar atributos, necesitará crear un tipo completo.

EDIT OP preguntó si los atributos se podían agregar 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 tipos en un ensamblado, y en general, son inmutables y no se pueden mutar en el 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

9

Primero, 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.

+0

Tienes razón, me refería al tipo Anon, gracias por la aclaración. – will

7

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

Esto no los agregará a la instancia 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.

+0

Nota, esto agrega atributos de nivel de clase, NO atributos de nivel de propiedad mencionados en el ejemplo de la pregunta. – DeepSpace101

Cuestiones relacionadas