Compartir a través de


Acceso a atributos mediante reflexión (Guía de programación de C#)

Actualización: noviembre 2007

El hecho de poder definir atributos personalizados y colocarlos en el código fuente tendría un valor escaso si no se dispone de un método para recuperar la información y actuar sobre ella. C# tiene un sistema de reflexión que permite recuperar la información definida con atributos personalizados. El método clave es GetCustomAttributes, el cual devuelve una matriz de objetos que son los equivalentes en tiempo de ejecución de los atributos del código fuente. Este método tiene varias versiones sobrecargadas. Para obtener más información, vea Attribute.

Una especificación de atributos tal como:

[Author("H. Ackerman", version = 1.1)]
class SampleClass

equivale conceptualmente a:

Author anonymousAuthorObject = new Author("H. Ackerman");
anonymousAuthorObject.version = 1.1;

Sin embargo, el código sólo se ejecuta cuando se consultan los atributos de SampleClass . Una llamada a GetCustomAttributes en SampleClass hace que se construya un objeto Author y se inicialice como se indicó anteriormente. Si la clase cuenta con otros atributos, se crean de forma similar otros objetos de atributo. A continuación, GetCustomAttributes devuelve el objeto Author y cualquier otro objeto de atributo en una matriz. Es posible recorrer en iteración esta matriz y determinar qué atributos se aplicaron según el tipo de cada elemento de la matriz, así como extraer información de los objetos atributo.

Ejemplo

A continuación se muestra un ejemplo completo. Se define un atributo personalizado, que se aplica a varias entidades, y se recupera por medio del mecanismo de reflexión.

[System.AttributeUsage(System.AttributeTargets.Class |
                       System.AttributeTargets.Struct,
                       AllowMultiple = true)  // multiuse attribute
]
public class Author : System.Attribute
{
    string name;
    public double version;

    public Author(string name)
    {
        this.name = name;
        version = 1.0;  // Default value
    }

    public string GetName()
    {
        return name;
    }
}

[Author("H. Ackerman")]
private class FirstClass
{
    // ...
}

// No Author attribute
private class SecondClass
{
    // ...
}

[Author("H. Ackerman"), Author("M. Knott", version = 2.0)]
private class ThirdClass
{
    // ...
}

class TestAuthorAttribute
{
    static void Main()
    {
        PrintAuthorInfo(typeof(FirstClass));
        PrintAuthorInfo(typeof(SecondClass));
        PrintAuthorInfo(typeof(ThirdClass));
    }

    private static void PrintAuthorInfo(System.Type t)
    {
        System.Console.WriteLine("Author information for {0}", t);
        System.Attribute[] attrs = System.Attribute.GetCustomAttributes(t);  // reflection

        foreach (System.Attribute attr in attrs)
        {
            if (attr is Author)
            {
                Author a = (Author)attr;
                System.Console.WriteLine("   {0}, version {1:f}", a.GetName(), a.version);
            }
        }
    }
}
/* Output:
    Author information for FirstClass
       H. Ackerman, version 1.00
    Author information for SecondClass
    Author information for ThirdClass
       M. Knott, version 2.00
       H. Ackerman, version 1.00
*/

Vea también

Conceptos

Guía de programación de C#

Referencia

Reflexión (Guía de programación de C#)

Atributos (Guía de programación de C#)

Utilizar atributos (Guía de programación de C#)

Eliminar la ambigüedad de los destinos de atributos (Guía de programación de C#)

Crear atributos personalizados (Guía de programación de C#)

System.Reflection

Attribute