2010-10-13 18 views
6

si he creado un atributo:¿Recuperar valores de parámetros de atributos personalizados?

public class TableAttribute : Attribute { 
    public string HeaderText { get; set; } 
} 

que aplico a algunos de mis propiedades en una clase

public class Person { 
    [Table(HeaderText="F. Name")] 
    public string FirstName { get; set; } 
} 

en mi opinión, tengo una lista de las personas, que estoy mostrando en una tabla ... ¿cómo puedo recuperar el valor de HeaderText para usar como mis encabezados de columna? Algo así como ...

<th><%:HeaderText%></th> 

Respuesta

23

En este caso, había primero recuperar el correspondiente PropertyInfo, a continuación, llamar MemberInfo.GetCustomAttributes (que pasa en su tipo de atributo). Eche el resultado a una matriz de su tipo de atributo, luego obtenga en la propiedad HeaderText de forma normal. Código de ejemplo:

using System; 
using System.Reflection; 

[AttributeUsage(AttributeTargets.Property)] 
public class TableAttribute : Attribute 
{ 
    public string HeaderText { get; set; } 
} 

public class Person 
{ 
    [Table(HeaderText="F. Name")] 
    public string FirstName { get; set; } 

    [Table(HeaderText="L. Name")] 
    public string LastName { get; set; } 
} 

public class Test 
{ 
    public static void Main() 
    { 
     foreach (var prop in typeof(Person).GetProperties()) 
     { 
      var attrs = (TableAttribute[]) prop.GetCustomAttributes 
       (typeof(TableAttribute), false); 
      foreach (var attr in attrs) 
      { 
       Console.WriteLine("{0}: {1}", prop.Name, attr.HeaderText); 
      } 
     } 
    } 
} 
0

solución de Jon Skeet es buena si permite que múltiples atributos del mismo tipo que se declare en una propiedad. (AllowMultiple = true)

ejemplo:

[Table(HeaderText="F. Name 1")] 
[Table(HeaderText="F. Name 2")] 
[Table(HeaderText="F. Name 3")] 
public string FirstName { get; set; } 

En su caso, asumiría solo deseas un atributo permitido por propiedad. En cuyo caso, se puede acceder a las propiedades del atributo personalizado a través de:

var tableAttribute= propertyInfo.GetCustomAttribute<TableAttribute>(); 
Console.Write(tableAttribute.HeaderText); 
// Outputs "F. Name" when accessing FirstName 
// Outputs "L. Name" when accessing LastName 
Cuestiones relacionadas