2010-10-13 39 views
6

nếu tôi đã tạo ra một thuộc tính:Truy lục giá trị thông số thuộc tính tùy chỉnh?

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

mà tôi áp dụng cho một vài trong số tài sản của tôi trong một lớp học

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

theo quan điểm của tôi, tôi có một danh sách những người mà tôi đang hiển thị trong một bảng .. làm thế nào tôi có thể lấy giá trị của HeaderText để sử dụng làm tiêu đề cột của tôi? Một cái gì đó giống như ...

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

Trả lời

23

Trong trường hợp này, trước tiên bạn sẽ lấy lại liên quan PropertyInfo, sau đó gọi MemberInfo.GetCustomAttributes (đi qua trong loại thuộc tính của bạn). Truyền kết quả cho một mảng thuộc loại thuộc tính của bạn, sau đó truy cập thuộc tính HeaderText như bình thường. Mã mẫu:

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

Giải pháp của Jon Skeet là tốt nếu bạn cho phép nhiều thuộc tính cùng loại được khai báo trên thuộc tính. (AllowMultiple = true)

ví dụ:

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

Trong trường hợp của bạn, tôi sẽ giả sử bạn chỉ muốn một thuộc tính cho phép mỗi tài sản. Trong trường hợp đó, bạn có thể truy cập thuộc tính của thuộc tính tùy chỉnh qua:

var tableAttribute= propertyInfo.GetCustomAttribute<TableAttribute>(); 
Console.Write(tableAttribute.HeaderText); 
// Outputs "F. Name" when accessing FirstName 
// Outputs "L. Name" when accessing LastName 
Các vấn đề liên quan