Làm thế nào tôi có thể phản ánh được thuộc tính có DataMember với một tên đã cho (giả sử mỗi DataMember có một tên duy nhất)? Ví dụ, trong đoạn mã sau tài sản với DataMember có tên "p1" là PropertyOne
:Cách nhận thuộc tính có thuộc tính DataMemberAttribute với tên được chỉ định?
[DataContract(Name = "MyContract")]
public class MyContract
{
[DataMember(Name = "p1")]
public string PropertyOne { get; set; }
[DataMember(Name = "p2")]
public string PropertyTwo { get; set; }
[DataMember(Name = "p3")]
public string PropertyThree { get; set; }
}
Hiện nay, tôi có:
string dataMemberName = ...;
var dataMemberProperties = typeof(T).GetProperties().Where(p => p.GetCustomAttributes(typeof(DataMemberAttribute), false).Any());
var propInfo = dataMemberProperties.Where(p => ((DataMemberAttribute)p.GetCustomAttributes(typeof(DataMemberAttribute), false).First()).Name == dataMemberName).FirstOrDefault();
này hoạt động, nhưng nó cảm thấy như nó có thể là được cải thiện. Tôi đặc biệt không thích rằng GetCustomAttributes()
được gọi là hai lần.
Làm cách nào để được viết lại tốt hơn? Lý tưởng nhất, nó sẽ là tuyệt vời nếu tôi có thể làm cho nó một lớp lót đơn giản.
Nó sẽ hiệu quả hơn để đầu lọc ra các thành viên mà không có một 'DataMemberAttribute' ở tất cả, và chỉ tải các dữ liệu thuộc tính cho những người có nó. Sử dụng phương thức tĩnh ['Attribute.IsDefined'] (http://msdn.microsoft.com/en-us/library/2fdf7hf1.aspx" trang tham chiếu MSDN ") cho mục đích này ... Nó hiệu quả hơn' GetCustomAttribute' . – stakx