2010-10-13 17 views
6

Jeśli mam utworzony atrybut:Pobieranie wartości parametrów niestandardowego atrybutu?

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

którą stosuje się do kilku moich właściwości w klasie

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

moim zdaniem mam listę osób, którym jestem prezentujących w sposób tabela .. w jaki sposób można pobrać wartość nagłówka nagłówka, który ma być używany jako nagłówek kolumny? Coś jak ...

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

Odpowiedz

23

W tym przypadku, można najpierw pobrać odpowiedni PropertyInfo, a następnie zadzwonić MemberInfo.GetCustomAttributes (przechodząc w swoim rodzaju atrybutu). Prześlij wynik do tablicy typu atrybutu, a następnie uzyskaj normalną właściwość HeaderText. Przykładowy kod:

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

Rozwiązanie Jona Skeeta jest dobre, jeśli pozwalasz na deklarowanie wielu atrybutów tego samego typu na nieruchomości. (AllowMultiple = true)

ex:

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

W twoim przypadku, to bym Zakładam, że chcą tylko jeden atrybut pozwoliło na nieruchomości. W takim przypadku możesz uzyskać dostęp do właściwości niestandardowego atrybutu przez:

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