W jaki sposób można uzyskać odbicie właściwości, która ma DataMember o danej nazwie (załóżmy, że każdy DataMember ma unikalną nazwę)? Na przykład w poniższym kodzie własność z DataMember który ma nazwę „P1” jest PropertyOne
:Jak uzyskać właściwość, która ma DataMemberAttribute o określonej nazwie?
[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; }
}
Obecnie mam:
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();
To działa, ale wydaje się, jakby to mogło być ulepszony. W szczególności nie podoba mi się, że GetCustomAttributes()
jest wywoływana dwa razy.
Jak można go lepiej napisać na nowo? Idealnie byłoby wspaniale, gdybym mógł uczynić to prostym jedno-liniowym.
To byłoby bardziej efektywne, aby najpierw odfiltrować członków, że nie mają 'DataMemberAttribute' w ogóle, a jedynie załadować dane atrybutów dla tych, które posiadać to. Użyj metody statycznej ['Attribute.IsDefined'] (http://msdn.microsoft.com/en-us/library/2fdf7hf1.aspx" strona referencyjna MSDN ") w tym celu ... Jest bardziej wydajna niż" GetCustomAttribute " . – stakx