¿Recuperar valores de parámetros de atributos personalizados?

Si he creado un atributo:

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

que aplico a algunas 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 personas que estoy mostrando en una tabla … ¿cómo puedo recuperar el valor de HeaderText para usar como encabezado de columna? Algo como…

  

En este caso, primero debe recuperar el PropertyInfo relevante, luego llamar a MemberInfo.GetCustomAttributes (pasando su tipo de atributo). Convierta el resultado en una matriz de su tipo de atributo, luego obtenga la propiedad HeaderText como de costumbre. Código de muestra:

 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); } } } } 

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

ex:

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

En su caso, asumo que solo desea un atributo permitido por propiedad. En cuyo caso, puede acceder a las propiedades del atributo personalizado a través de:

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