2009-02-19 56 views

Respuesta

2

Editar: aclare, ¿está hablando de c# attributes o de miembros de su clase?

La única forma en que puede agregar atributos de C# es generar una clase completamente nueva con los atributos adicionales, compilar y cargar el nuevo ensamblado en su AppDomain existente.

+0

Y por clase, que significa un tipo totalmente nuevo, no sólo otro ejemplo de la misma clase. –

+0

@Joel tiene razón, puedo ver que podría ser un poco ambiguo. Gracias –

1

Usa una tabla hash para almacenar tus atributos.

Si desea más flexibilidad de tiempo de ejecución, puede probar Ruby u otro lenguaje interpretado.

+0

s/interpreted/dynamic /. Ruby, PHP y Python son dinámicos. C#, Java y VB son estáticos. – strager

+0

@ bill Creo que se refiere al lenguaje dinámico ... –

+0

Claro, buen punto. Se puede compilar cualquier idioma y se puede interpretar cualquier idioma. Es una extraña coincidencia que Ruby, PHP y Python se interpreten en general y se compilan C#, Java y VB ... –

0

Los atributos son parte de los metadatos de un tipo y, por lo tanto, están codificados en el ensamblado compilado (es por eso que solo se permite el uso de algunos tipos primitivos y no datos arbitrarios en los atributos).

La consecuencia es que no puede agregar ningún atributo a un tipo en tiempo de ejecución. Pero hay varias técnicas alternativas. Puede usar diccionarios simples o algo más poderoso como attached dependency properties.

9

lo que hay que ver los atributos? Si se trata de cosas como el enlace de datos, etc, TypeDescriptor debería funcionar:

TypeDescriptor.AddAttributes(type, attribs); 
TypeDescriptor.AddAttributes(instance, attribs); 

Esto sólo afecta a System.ComponentModel uso (reflexión no directa), pero que a menudo es suficiente - por ejemplo, se puede asociar una TypeConverter a través de lo anterior.

Si con "atributos" quiere decir "propiedades", entonces (de nuevo, en lo que se refiere a la vinculación de datos) TypeDescriptor también tiene potencial allí, pero no es trivial; necesita implementar ICustomTypeDescriptor en el objeto, o escribir un CustomTypeDescriptor para el tipo, y en cualquier caso, debe escribir su propia implementación PropertyDescriptor (a menudo hablando con un diccionario por instancia, etc.). Esto se acostumbrará por cualquier cosa que utiliza:

// only works if you use TypeDescriptionProvider 
PropertyDescriptorCollection typeProps = TypeDescriptor.GetProperties(type); 
// works via TypeDescriptionProvider or ICustomTypeDescriptor 
PropertyDescriptorCollection objProps = TypeDescriptor.GetProperties(obj); 

Una vez más, esto cubre una amplia gama de escenarios de enlace de datos y similares. Para un ejemplo de esto, see here, está lejos de ser trivial, sin embargo. El ejemplo de uso (desde el enlace) añade dos propiedades en tiempo de ejecución:

Bag.AddProperty<int>("TestProp", new DefaultValueAttribute(5)); 
Bag.AddProperty<string>("Name"); 
Cuestiones relacionadas