2012-01-20 40 views
5

vì vậy tôi có một bộ sưu tập Thuộc tính từ lớp mà tôi muốn lặp qua. Đối với mỗi thuộc tính, tôi có thể có các thuộc tính tùy chỉnh vì vậy tôi muốn lặp qua các thuộc tính đó. Trong trường hợp này tôi có một thuộc tính tùy chỉnh trên thành phố lớp của tôi như vậyC# Thuộc tính tùy chỉnh từ Thuộc tính

public class City 
{ 
    [ColumnName("OtroID")] 
    public int CityID { get; set; } 
    [Required(ErrorMessage = "Please Specify a City Name")] 
    public string CityName { get; set; } 
} 

Thuộc tính được định nghĩa như vậy

[AttributeUsage(AttributeTargets.All)] 
public class ColumnName : System.Attribute 
{ 
    public readonly string ColumnMapName; 
    public ColumnName(string _ColumnName) 
    { 
     this.ColumnMapName= _ColumnName; 
    } 
} 

Khi tôi cố gắng để lặp qua các thuộc tính [mà hoạt động tốt] và sau đó lặp qua các thuộc tính nó chỉ bỏ qua vòng lặp for cho thuộc tính và trả về không có gì.

foreach (PropertyInfo Property in PropCollection) 
//Loop through the collection of properties 
//This is important as this is how we match columns and Properties 
{ 
    System.Attribute[] attrs = 
     System.Attribute.GetCustomAttributes(typeof(T)); 
    foreach (System.Attribute attr in attrs) 
    { 
     if (attr is ColumnName) 
     { 
      ColumnName a = (ColumnName)attr; 
      var x = string.Format("{1} Maps to {0}", 
       Property.Name, a.ColumnMapName); 
     } 
    } 
} 

Khi tôi đi đến cửa sổ ngay lập tức cho các tài sản mà có một tùy chỉnh thuộc tính tôi có thể làm

?Property.GetCustomAttributes(true)[0] 

Nó sẽ trở lại ColumnMapName: "OtroID"

tôi dường như không thể để phù hợp với công việc này để lập trình mặc dù

+1

Như một mặt lưu ý: Theo quy ước, lớp thuộc tính nên được gọi là 'ColumnNameAttribute'. – Heinzi

+3

Chỉ cần quan tâm 'T' trong' typeof (T) 'là gì? Trong cửa sổ ngay lập tức bạn đang gọi Property.GetCustomAttribute (true) [0] nhưng bên trong vòng lặp foreach bạn đang gọi GetCustomattributes trên typeparameter thay vì –

+0

Tôi không thấy quá tải thuộc tính Attribute.GetCustomAttributes() chỉ chấp nhận tham số Kiểu.Bạn có chắc chắn rằng dòng mà bạn lấy các thuộc tính là chính xác? – JMarsch

Trả lời

2

Repost từ Comments của câu hỏi ban đầu, ít tác giả yêu cầu

Chỉ cần ra khỏi sự quan tâm T là gì trong typeof (T)?

Trong cửa sổ ngay lập tức bạn đang gọi Property.GetCustomAttribute (true) [0] nhưng bên trong vòng lặp foreach bạn đang gọi GetCustomattributes trên typeparameter thay thế.

dòng này:

System.Attribute[] attrs = System.Attribute.GetCustomAttributes(typeof(T)); 

nên được này

System.Attribute[] attrs = property.GetCustomAttributes(true); 

Trân trọng,

8

Bạn muốn làm điều này Tôi tin rằng:

PropertyInfo[] propCollection = type.GetProperties(); 
foreach (PropertyInfo property in propCollection) 
{ 
    foreach (var attribute in property.GetCustomAttributes(true)) 
    { 
     if (attribute is ColumnName) 
     { 
     } 
    } 
} 
1

Trong giao diện bên trong, bạn nên điều tra Thuộc tính, không phải kiểu typeof (T).

Sử dụng tính năng intellisense và xem xét các phương pháp bạn có thể gọi tắt của đối tượng Thuộc tính.

Thuộc tính.GetCustomAttributes (Boolean) có thể có tầm quan trọng đối với bạn. Điều này sẽ trả về một mảng, và bạn có thể sử dụng LINQ trên nó để nhanh chóng trả về tất cả các thuộc tính phù hợp với yêu cầu của bạn.

1

Tôi nhận mã này để kết thúc với giá trị là x"OtroID Maps to CityID".

var props = typeof(City).GetProperties(); 
foreach (var prop in props) 
{ 
    var attributes = Attribute.GetCustomAttributes(prop); 
    foreach (var attribute in attributes) 
    { 
     if (attribute is ColumnName) 
     { 
      ColumnName a = (ColumnName)attribute; 
      var x = string.Format("{1} Maps to {0}",prop.Name,a.ColumnMapName); 
     } 
    } 
} 
Các vấn đề liên quan