2013-04-30 14 views
8

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.

+2

Der Nullkoaleszenzoperator funktioniert nicht, da eine 'FieldInfo' keine' PropertyInfo' ist. Verwende 'as' um sie zu werfen. – FlyingStreudel

Antwort

12

Ändern Sie diese Zeile:

MemberInfo info = type.GetField(memberName) ?? type.GetProperty(memberName); 

dazu:

MemberInfo info = type.GetField(memberName) as MemberInfo ?? 
    type.GetProperty(memberName) as MemberInfo; 

, weil es auf die Basisklasse keine implizite Umwandlung ist, wenn die ternäre Operator wie die Verwendung. Das ternäre System erfordert, dass die Typen aller Ausgänge gleich sind.

+4

Das ist nicht der ternäre Operator, es ist der nullverschmelzende Operator. –

+1

Außerdem ... ist der Name der * bedingte * Operator –

+0

@MichaelPerrenoud Das mag wahr sein, aber sie sind separate Operatoren in der Sprachspezifikation. Der Subtraktionsoperator könnte syntaktischer Zucker für eine Negation und eine Addition sein, aber wenn ja, würden Sie ihn Additionsoperator nennen? (Und die Spezifikation nennt "ternary operator" als alternativen Namen für den bedingten Operator.) –

Verwandte Themen