Obwohl die ursprüngliche Frage lautete, wie man den Wert der Eigenschaft mit nur einer Zeichenkette als Parameter abrufen ist es hier sehr sinnvoll, einen Ausdruck und nicht nur eine Zeichenkette zu verwenden, um sicherzustellen, dass der Aufrufer niemals einen hart kodierten Eigenschaftsnamen verwendet. Hier ist eine einzeilige Version mit Verwendung:
public static class Utils
...
public static TVal GetPropertyValue<T, TVal>(T t, Expression<Func<T, TVal>> x)
=> (TVal)((x.Body as MemberExpression)?.Member as PropertyInfo)!.GetValue(t);
...
var val = Utils.GetPropertyValue(foo, p => p.Bar);
Hier ist eine etwas bessere Version im Hinblick auf die Lesbarkeit und Fehlerbehandlung:
public static TVal GetPropertyValue<T, TVal>(T t, Expression<Func<T, TVal>> x)
{
var m = (x.Body as MemberExpression)?.Member
var p = m as PropertyInfo;
if (null == p)
throw new ArgumentException($"Unknown property: {typeof(T).Name}.{(m?.Name??"???")}");
return (TVal)p.GetValue(t);
}
Kurz gesagt, Sie geben einen Lambda-Ausdruck ein, der eine Eigenschaft ausliest. Der Körper des Lambda-Ausdrucks - der Teil rechts vom fetten Pfeil - ist ein Member-Ausdruck, aus dem Sie den Member-Namen erhalten und den Sie in eine PropertyInfo umwandeln können, vorausgesetzt, der Member ist tatsächlich eine Property und nicht etwa eine Methode.
In der Kurzfassung sagt der null-vergebende Operator - das ! im Ausdruck - dem Compiler, dass die PropertyInfo nicht null sein wird. Dies ist eine große Lüge und Sie erhalten zur Laufzeit eine NullReferenceException. Die längere Version gibt Ihnen den Namen der Eigenschaft, wenn sie es schafft, ihn zu erhalten.
PS: Dank an Oleg G. für die erste Version dieses Codes :)