我該如何反思性地獲取具有給定名稱的DataMember的屬性(讓我們假設每個DataMember都有一個唯一的名稱)?例如,下面的代碼使用具有名稱「P1」的數據成員的屬性是PropertyOne
:如何獲取具有指定名稱的DataMemberAttribute的屬性?
[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; }
}
目前,我有:
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();
這工作,但感覺像它可能是改進。我特別不喜歡GetCustomAttributes()
被調用兩次。
如何重寫更好?理想情況下,如果我能把它作爲一個簡單的單線程,那將是非常棒的。
這將是更有效的先過濾掉沒有'DataMemberAttribute'可言的,只加載屬性數據的那些成員有它。爲此,使用['Attribute.IsDefined'靜態方法](http://msdn.microsoft.com/en-us/library/2fdf7hf1.aspx「MSDN參考頁面」)...它比'GetCustomAttribute'更有效率。 – stakx