Hallo,
ich brauche von einem Property den aktuellen Wert und einen bestimmten Wert von einem Property-Attribute.
Jetzt ist ja die "herkömmliche" Vorgehensweise so, dass man mit GetProperty("PropertyName") eine Instanz von PropertyInfo erhält und dann kann ich mittels GetValue an den aktuellen Wert kommen und mit GetCustomAttributes eben an den Attributewert.
Was mir an dieser Lösung nicht gefällt ist der "fest verdrahtete" String in der GetProperty-Methode.
Klar, ich kann Konstanten festlegen, aber ich stelle mir die Frage, ob es nicht eine schönere Lösung gibt, wo mittels der Property der Klasseninstanz die Werte abgefragt werden können.
Bei Threads ist es doch auch so, dass man mit dem Delegate den Methodennamen angibt.
Ich hätte gerne eine Lösung in der Art:
// The classic way
PropertyInfo propertyInfo = this.GetType().GetProperty("Description")
// The other way?
PropertyInfo propertyInfo = this.GetType().GetProperty(this.Description[Delegate?].getName())
Description ist der Name des Properties, ich möchte direkt mit der Instanz arbeiten, so dass ich den fest verdrahteten String, hier "Description" vermeiden kann.
Geht das irgendwie?
public static string GetPropertyName<T>( Expression<Func<T, object>> expr )
{
var body = expr.Body as MemberExpression;
if ( body != null )
{
return body.Member.Name;
}
return ( ( MemberExpression ) ( ( UnaryExpression ) expr.Body ).Operand ).Member.Name;
}
Ist die kürzeste Fassung, die ich kenne.
Verwendung dann GetPropertyName<ClassName>( cl => cl.Description )
.
PS: sowas nennt man auch "Magic String": Magic Strings vermeiden
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code