我该如何反思性地获取具有给定名称的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