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