Pregunta

He visto el siguiente código:

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

La funcionalidad del fragmento anterior parece lo suficientemente clara, no tengo idea de cómo puedo usarla 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 novedosa / útil que pueda realizar esta función.

¿Fue útil?

Solución

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. El compilador le da un tratamiento especial a algunos atributos, por ejemplo, [PrincipalPermission (...)] agrega seguridad declarativa a un método, lo que le permite (automáticamente) verificar que el usuario tenga un acceso adecuado.

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

Otros consejos

  

La funcionalidad de lo anterior.   Snippit parece suficientemente claro,

Quizás no, ya que muchas personas piensan que [DefaultValue ()] establece el valor de la propiedad. En realidad, todo lo que hace para decirle a algún diseñador visual (por ejemplo, Visual Studio), a qué se va a configurar el código es el valor predeterminado. De esa manera, se sabe en negrita el valor en la ventana de propiedades si está configurado para otra cosa.

El diseñador visual utiliza los ejemplos de su ejemplo (es decir, MS Expression Blend y Visual Studio) para proporcionar sugerencias en la interfaz de usuario del diseñador.

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

Si, por algún motivo, desea acceder a estos atributos, deberá usar reflexión .

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

Se llaman Atributos, hay mucha información en msdn, por ejemplo. http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx

En general no lo hacen " hacer " cualquier cosa por su cuenta, son usados ??por algún otro código que usará su clase. XmlSerialization es un buen ejemplo: XmlSerializer (proporcionado por Microsoft como parte del marco) puede casi cualquier clase (aunque hay una serie de requisitos en la clase) - usa la reflexión para ver qué datos están contenidos en la clase. Puedes usar atributos (definidos junto con XmlSerializer) para cambiar la forma en que XmlSerializer serializará tu clase (por ejemplo, dile que guarde los datos como atributo en lugar de un elemento).

Lo usamos para definir qué diseñador gráfico se debe cargar 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 comandos posibles tipos de una asamblea. Estos tipos de comandos tienen propiedades que necesitan ser configuradas, por lo tanto, cada tipo de comando tiene la necesidad de un diseñador diferente (usercontrol).

Por ejemplo, considere el siguiente tipo de comando (denominado compuesto en nuestra solución)

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

Esta información se utiliza en dos lugares

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

2) Cuando el usuario agrega un comando al diseñador y el diseñador crea    una instancia de esa clase, mira la propiedad CompositeDesigner,    crea una nueva instancia del tipo especificado (usercontrol) y lo agrega    al diseñador visual.

Considere el siguiente código, que usamos para cargar los comandos en nuestra " barra de herramientas " ;:

foreach (Type t in assembly.GetExportedTypes())  
{
    Console.WriteLine(t.Name);

    if (t.Name.EndsWith("Composite"))
    {
        var attributes = t.GetCustomAttributes(false);
        ToolboxListItem item = new ToolboxListItem();

        CompositeMetaDataAttribute meta = (CompositeMetaDataAttribute)attributes
                              .Where(a => a.GetType() == typeof(Vialis.LightLink.Attributes.CompositeMetaDataAttribute)).First();
        item.Name = meta.DisplayName;
        item.Description = meta.Description;
        item.Length = meta.Length;
        item.CompositType = t;

        this.lstCommands.Items.Add(item);
    }                           
}

Como puede ver, para cada tipo en el ensamblaje cuyo 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 se recupera así:

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

Este es solo un ejemplo de cómo puedes usar atributos personalizados,

Espero que esto te dé un lugar para comenzar.

Estos atributos personalizan la experiencia de tiempo de diseño.

http://msdn.microsoft.com/en-us/library /a19191fh.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top