2008-10-16 13 views
14

he visto el siguiente código:C# propiedad

[DefaultValue(100)] 
[Description("Some descriptive field here")] 
public int MyProperty{...} 

La funcionalidad de la snippit anterior parece bastante claro, no tengo ni idea de cómo lo puedo usar para hacer cosas útiles. ¡Ni siquiera estoy seguro de qué nombre darle!

¿Alguien sabe dónde puedo encontrar más información/un tutorial sobre estos atributos de propiedad? También me interesaría cualquier tarea nueva/útil que esta función pueda hacer.

Respuesta

13

Las personas ya han cubierto el aspecto de la interfaz de usuario: los atributos tienen otros usos, aunque ... por ejemplo, se usan ampliamente en la mayoría de los marcos de serialización. Algunos atributos reciben un tratamiento especial por parte del compilador; por ejemplo, [PrincipalPermission(...)] agrega seguridad declarativa a un método, lo que le permite (automáticamente) verificar que el usuario tenga acceso adecuado.

Para agregar su propio manejo especial, puede usar PostSharp; hay muchos ejemplos excelentes de usar PostSharp para hacer cosas de AOP, como el registro, o simplemente la simplificación de código, como con automatic INotifyPropertyChanged implementation.

6

Los que están en tu ejemplo es usado por el diseñador visual (es decir, MS Expression Blend y el diseñador de Visual Studio) para dar consejos en la interfaz de usuario de diseño.

Tenga en cuenta que son metadatos y no afectarán la lógica de la propiedad. Por ejemplo, la configuración DefaultValue no configurará la propiedad a ese valor de forma predeterminada, debe hacerlo manualmente.

Si por algún motivo desea acceder a estos atributos, deberá use reflection.

Consulte MSDN para obtener más información sobre los atributos del diseñador.

+0

También se usan en el diseñador de Visual Studio. –

+0

Y es importante tener en cuenta que son sólo sugerencias: todavía tiene que establecer el valor predeterminado de MyPoperty en 100 en el código, por ejemplo, o terminará mintiendo al consumidor de su propiedad. –

6

Se llaman atributos, hay mucha información en msdn, p. Ej. http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx

En general, no "hacen" nada por sí solos, sino que son utilizados por algún otro código que utilizará su clase. XmlSerialization es un buen ejemplo: XmlSerializer (provisto por Microsoft como parte del framework) puede casi cualquier clase (aunque hay una serie de requisitos en la clase): utiliza la reflexión para ver qué datos contiene la clase. Puede usar atributos (definidos junto con XmlSerializer) para cambiar la forma en que XmlSerializer serializará su clase (por ejemplo, dígale que guarde los datos como atributo en lugar de como elemento).

27

La funcionalidad de la snippit anterior parece bastante claro,

Tal vez no, ya que muchas personas piensan que [DefaultValue()] conjuntos el valor de la propiedad. En realidad, todo lo que hace es contarle a un diseñador visual (por ejemplo, Visual Studio), a qué va a establecer el valor predeterminado el código. De esta forma, conoce negrita el valor en la Ventana de propiedades si está configurado en otra cosa.

+0

Entonces, si no configuré MyProperty explícitamente a otro valor, ¿el diseñador de formularios (o equivalente) establecería MyProperty en 100 detrás de las escenas? –

+3

¡NO! Si no establece explícitamente MyProperty en un valor, se establecerá de manera predeterminada en 0 (suponiendo que se trata de una tienda de respaldo). El diseñador de formularios mostrará el valor como "0", pero en negrita, para indicar que se cambió manualmente del valor predeterminado. Si solo afecta el aspecto del valor en el diseñador de formularios. –

+0

Ahhh, tiene sentido. ¡Gracias! –

3

Lo usamos para definir qué diseñador gráfico debe cargarse para configurar una instancia de un tipo específico.

Es decir, tenemos un tipo de diseñador de flujo de trabajo que carga todos los tipos de comandos de un ensamblaje. Estos tipos de comando tienen propiedades que deben configurarse, , por lo que cada tipo de comando necesita un diseñador diferente (usercontrol).

Por ejemplo, consideremos el siguiente tipo de comando (llamado un compuesto en el que nuestra solución)

[CompositeMetaData("Delay","Sets the delay between commands",1)] 
[CompositeDesigner(typeof(DelayCompositeDesigner))] 
public class DelayComposite : CompositeBase 
{ 
     // code here 
} 

Esta es la información se utiliza en dos lugares

1) Cuando el diseñador crea una lista de comandos, usa CompositeMetaData para mostrar más información sobre el comando.

2) Cuando el usuario añade un comando para el diseñador y el diseñador crea una instancia de esa clase, se ve en la propiedad CompositeDesigner, crea una nueva instancia del tipo especificado (usercontrol) y lo añade a el diseñador visual.

considere el siguiente código, se utiliza para cargar los comandos en nuestra "barra de herramientas":

Como se puede ver, para cada tipo en la asamblea de la cual el nombre termina con "Compuesto", obtenemos los atributos personalizados y usamos esa información para completar nuestra instancia de ToolboxListItem.

En cuanto a la carga del diseñador, el atributo es retreived así:

var designerAttribute = (CompositeDesignerAttribute)item.CompositType.GetCustomAttributes(false) 
         .Where(a => a.GetType() == typeof(CompositeDesignerAttribute)).FirstOrDefault(); 

Este es sólo un ejemplo de cómo puede ser capaz de utilizar los atributos personalizados,

Espero que esto te un da lugar para comenzar.