¿Se pueden agregar atributos dinámicamente en C#?

Resuelto Jon Turner asked hace 16 años • 10 respuestas

¿Es posible agregar atributos en tiempo de ejecución o cambiar el valor de un atributo en tiempo de ejecución?

Jon Turner avatar Sep 25 '08 02:09 Jon Turner
Aceptado

Esto realmente depende de qué es exactamente lo que estás tratando de lograr.

El material System.ComponentModel.TypeDescriptor se puede usar para agregar atributos a tipos, propiedades e instancias de objetos, y tiene la limitación de que también debe usarlo para recuperar esas propiedades. Si está escribiendo el código que consume esos atributos y puede vivir dentro de esas limitaciones, definitivamente lo sugeriría.

Hasta donde yo sé, el control PropertyGrid y la superficie de diseño de Visual Studio son las únicas cosas en BCL que consumen el material TypeDescriptor. De hecho, así es como hacen aproximadamente la mitad de las cosas que realmente necesitan hacer.

Alex Lyman avatar Sep 24 '2008 19:09 Alex Lyman

Los atributos son metadatos estáticos. Los ensamblados, módulos, tipos, miembros, parámetros y valores de retorno no son objetos de primera clase en C# (por ejemplo, la System.Typeclase es simplemente una representación reflejada de un tipo). Puede obtener una instancia de un atributo para un tipo y cambiar las propiedades si se pueden escribir, pero eso no afectará el atributo tal como se aplica al tipo.

Mark Cidade avatar Sep 24 '2008 19:09 Mark Cidade

No puedes. Una solución alternativa podría ser generar una clase derivada en tiempo de ejecución y agregar el atributo, aunque esto probablemente sea un poco excesivo.

petr k. avatar Sep 24 '2008 19:09 petr k.

Bueno, para ser diferente, encontré un artículo que hace referencia al uso de Reflection.Emit para hacerlo.

Aquí está el enlace: http://www.codeproject.com/KB/cs/dotnetattributes.aspx , también querrás consultar algunos de los comentarios al final del artículo, porque se analizan posibles enfoques.

torial avatar Sep 24 '2008 19:09 torial

No, no es.

Los atributos son metadatos y se almacenan en formato binario en el ensamblado compilado (es por eso que solo puedes usar tipos simples en ellos).

Thomas Danecker avatar Sep 24 '2008 19:09 Thomas Danecker