【发布时间】:2013-01-18 06:04:54
【问题描述】:
我怎样才能反射性地获取具有给定名称的 DataMember 的属性(假设每个 DataMember 都有一个唯一的名称)?例如,在以下代码中,名称为“p1”的 DataMember 的属性为 PropertyOne:
[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的成员,只为有DataMemberAttribute的成员加载属性数据会更有效。为此目的使用Attribute.IsDefinedstatic method...它比GetCustomAttribute更有效。
标签: c# .net reflection properties propertyinfo