2010-07-07 16 views
15

Realmente no sé mucho acerca de los atributos en general en C#, los he visto en uso de muchas maneras/lugares diferentes, pero no creo que vea la importancia de algunos de ellos. Algunos definitivamente tienen importancia porque proporcionan una función notable, como [Serializable]. Sin embargo, otros no parecen tan importantes, como uno que usa mi compañero de trabajo para marcar propiedades con [DataMember].C# Atributos y sus usos

Supongo que mi pregunta es, ¿qué son los atributos y cómo son útiles? ¿Hay alguna manera de crear mis propios atributos y cómo puedo decir si los campos/métodos/clases/lo que sea tienen atributos particulares o qué valores se establecen en esos atributos?

+0

FYI, '[DataMember]' se utiliza para la serialización de contratos de datos: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx –

Respuesta

20

¿cuáles son los atributos?

Los atributos le permiten incrustar información sobre un tipo o método en los metadatos que describen ese tipo o método.

You typically want to use attributes to describe facts about the mechanism of the type or method rather than the meaning of the type or method. Por ejemplo, supongamos que tiene un empleado de tipo. Un hecho sobre el que significa del empleado es que es un tipo de persona, que un empleado tiene un administrador, y así sucesivamente. Un hecho sobre el mecanismo del empleado es que puede ser el objetivo del enlace de datos, o puede ser serializado en el disco, o lo que sea. Un empleado no se puede serializar en el disco, pero el empleado clase puede ser. Los atributos le permiten separar información sobre los detalles técnicos del modelo semántico.

¿Hay alguna manera de crear mis propios atributos?

Sí. Crea una clase que amplíe Atributo. Por convención, quiere ponerle el nombre "FooAttribute". Si lo hace, puede usar la sintaxis [Foo] o la sintaxis [FooAttribute] a su discreción.

¿Cómo puedo saber si los campos/métodos/clases/lo que tienen atributos particulares o qué valores se establecen en esos atributos?

Utilice el método GetCustomAttributes en los objetos de reflexión.

¿Dónde debería leer para obtener más información?

de inicio con el tutorial atributos:

http://msdn.microsoft.com/en-us/library/aa288454(VS.71).aspx

y luego leer todo el capítulo 17 de la especificación de C#.

5

Creo que la respuesta a la siguiente pregunta le dará una idea de sus preguntas.

How do attribute classes work?

Aquí es un repost de la respuesta que he dado.

Los atributos son esencialmente metadatos que pueden adjuntarse a varias partes de su código. Estos metadatos pueden ser intercalados y afectar el comportamiento de ciertas operaciones.

Los atributos se pueden aplicar a casi todos los aspectos de su código. Por ejemplo, los atributos pueden asociarse en el nivel de ensamblaje, como los atributos AssemblyVersion y AssemblyFileVersion, que rigen los números de versión asociados con el ensamblaje.

[assembly: AssemblyVersion("1.0.0.0")] 
[assembly: AssemblyFileVersion("1.0.0.0")] 

El atributo Serializable por ejemplo se puede aplicar a una declaración de tipo para marcar el tipo como serialización de soporte. De hecho, este atributo tiene un significado especial dentro del CLR y en realidad está almacenado como una directiva especial directamente en el tipo en el IL, esto está optimizado para almacenarse como un indicador de bit que se puede procesar de manera mucho más eficiente, hay algunos atributos en esta naturaleza, que se conocen como atributos pseudo personalizados.

Todavía otros atributos se pueden aplicar a métodos, propiedades, campos, enumeraciones, los valores de retorno, etc Usted puede tener una idea de los posibles objetivos de un atributo se puede aplicar a examinado este enlace http://msdn.microsoft.com/en-us/library/system.attributetargets(VS.90).aspx

Más a esto, puede definir sus propios atributos personalizados que luego se pueden aplicar a los objetivos aplicables a los que se destinan sus atributos. Luego, en tiempo de ejecución su código podría reflejar los valores contenidos en los atributos personalizados y tomar las medidas adecuadas.

Para un ejemplo bastante ingenuo, y esto solo por el simple :) Puede escribir un motor de persistencia que mapeará Clases automáticamente a tablas en su base de datos y correlacionará las propiedades de las columnas Clase a tabla . Se podría empezar por definir dos atributos personalizados

TableMappingAttribute 
ColumnMappingAttribute 

que luego se puede aplicar a sus clases, como ejemplo tenemos una clase Persona

[TableMapping("People")] 
public class Person 
{ 
    [ColumnMapping("fname")] 
    public string FirstName {get; set;} 

    [ColumnMapping("lname")] 
    public string LastName {get; set;} 
} 

Cuando esto compila, aparte del hecho de que el compilador emite los metadatos adicionales definidos por los atributos personalizados, poco más se ve afectado. Sin embargo, ahora puede escribir un PersistanceManager que puede inspeccionar dinámicamente los atributos de una instancia de la clase Person e insertar los datos en la tabla People, asignando los datos en la propiedad FirstName a la columna fname y la propiedad LastName a la columna lname.

En cuanto a su pregunta con respecto a las instancias de los atributos, la instancia del atributo no se crea para cada instancia de su clase. Todas las instancias de personas compartirán la misma instancia de TableMappingAttribute y ColumnMappingAttributes. De hecho, las instancias de atributo solo se crean cuando realmente consultas los atributos la primera vez.

7

Attributes son un medio por el cual puede asociar metadatos con tipos en .NET. Esto le permite buscar un tipo y obtener información al respecto que está separada de la información del "tipo de tiempo de ejecución" del tipo.

Esto puede ser muy útil. Mencionó [Serializable], pero otros ejemplos simples incluyen muchos de los tipos System.ComponentModel, como Description, que la cuadrícula de propiedades utiliza para "describir" las propiedades cuando trabaja con ellos en el diseñador. Dado que la "descripción" de una propiedad no está realmente relacionada con el comportamiento del tipo en un programa (en tiempo de ejecución), no pertenece a la clase. Sin embargo, es muy útil cuando va a editar un control en un diseñador visual, por ejemplo, para ver una descripción (o categoría, etc.) de una propiedad. Los atributos son el medio por el cual se maneja esto.

+2

puede crear su propio atributo por hereda de la clase System.Attribute y especifique el alcance de la misma para consultar la clase/métodos decorados con el atributo que puede usar reflection foreach (var attrib en typeof (YOURCLASS) .GetCustomAttributes()) – Rony

0

C# proporciona un mecanismo para definir etiquetas declarativas, llamadas atributos, que puede colocar en ciertas entidades en su código fuente para especificar información adicional. La información que los atributos contienen se puede recuperar en tiempo de ejecución a través de la reflexión. Puede usar atributos predefinidos o puede definir sus propios atributos personalizados.

http://msdn.microsoft.com/en-us/library/aa288059%28v=VS.71%29.aspx

Cuestiones relacionadas