Wie kann ich die Eigenschaft, die das DataMember hat, reflektiv mit einem bestimmten Namen abrufen (nehmen wir an, dass jedes DataMember einen eindeutigen Namen hat)? Zum Beispiel in dem folgenden Code die Eigenschaft mit dem Datamember, der Name „p1“ hat PropertyOne
ist:Wie erhält man die Eigenschaft, die ein DataMemberAttribute mit einem angegebenen Namen hat?
[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; }
}
Derzeit habe ich:
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();
Dies funktioniert, aber es fühlt sich an wie es sein könnte verbessert. Besonders gefällt mir nicht, dass GetCustomAttributes()
zweimal aufgerufen wird.
Wie kann es besser umgeschrieben werden? Im Idealfall wäre es toll, wenn ich es zu einem einfachen One-Liner machen könnte.
Es wäre effizienter, zuerst Mitglieder herauszufiltern, die nicht eine 'DataMemberAttribute' gar nicht installiert haben, und nur die Attributdaten für die Last, die habe es. Verwenden Sie dazu die statische Methode '' Attribute.IsDefined' '(http://msdn.microsoft.com/en-us/library/2fdf7hf1.aspx "MSDN-Referenzseite"). Dies ist effizienter als 'GetCustomAttribute' . – stakx