Come posso ottenere in modo riflessivo la proprietà che ha DataMember con un nome specifico (assumiamo che ogni DataMember abbia un nome univoco)? Ad esempio, nel seguente codice della proprietà con il DataMember che ha nome "p1" è PropertyOne
:Come ottenere la proprietà con DataMemberAttribute con un nome specificato?
[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; }
}
Attualmente, ho:
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();
questo funziona, ma ci si sente come potrebbe essere migliorata. In particolare, non mi piace che lo GetCustomAttributes()
venga chiamato due volte.
Come può essere riscritto meglio? Idealmente, sarebbe bello se potessi farne una semplice copertina.
Sarebbe più efficace per filtrare first out i membri che non hanno un 'DataMemberAttribute' a tutti, e caricare solo i dati degli attributi per coloro che averlo. Utilizzare il [metodo statico '' Attribute.IsDefined'] (http://msdn.microsoft.com/en-us/library/2fdf7hf1.aspx "pagina di riferimento MSDN") per questo scopo ... È più efficiente di 'GetCustomAttribute' . – stakx