Gibt es eine Möglichkeit, einer Funktion einen Namen zu geben, der dann den Wert des Felds oder der Eigenschaft für ein bestimmtes Objekt mit diesem Namen zurückgibt? Ich habe versucht, mit dem Null-Koaleszenz-Operator zu umgehen, aber anscheinend mag das nicht verschiedene Typen (was auch ein bisschen komisch für mich ist, weil null null ist). Ich könnte es in Nullen trennen, aber es muss einen besseren Weg geben, dies zu tun. Hier ist meine Funktion, und die zwei Zeilen mit Comparison
Objekte kompilieren nicht, aber ich werde sie dort hinein lassen, um zu zeigen, was ich versuche zu tun.C# Reflektion Feld oder Eigenschaft nach Name erhalten
private void SortByMemberName<T>(List<T> list, string memberName, bool ascending)
{
Type type = typeof (T);
MemberInfo info = type.GetField(memberName) ?? type.GetProperty(memberName);
if (info == null)
{
throw new Exception("Member name supplied is neither a field nor property of type " + type.FullName);
}
Comparison<T> asc = (t1, t2) => ((IComparable) info.GetValue(t1)).CompareTo(info.GetValue(t2));
Comparison<T> desc = (t1, t2) => ((IComparable) info.GetValue(t2)).CompareTo(info.GetValue(t1));
list.Sort(ascending ? asc : desc);
}
Ich habe von etwas namens dynamischer Linq gehörte, die verwendet werden könnten, aber im Interesse des Lernens, ich bin es auf meine Weise tun.
Der Nullkoaleszenzoperator funktioniert nicht, da eine 'FieldInfo' keine' PropertyInfo' ist. Verwende 'as' um sie zu werfen. – FlyingStreudel