2013-04-30 25 views
8

Czy istnieje sposób na podanie nazwy funkcji, która następnie zwraca wartość pola lub właściwości danego obiektu o tej nazwie? Próbowałem obejść to z operatorem zerowej koalescencji, ale najwyraźniej nie lubię różnych typów (co jest dla mnie trochę dziwne, ponieważ null ma wartość null). Mogłabym to rozdzielić na zero, ale musi być lepszy sposób na zrobienie tego. Oto moja funkcja, a dwie linie z obiektami Comparison nie kompilują się, ale zostawię je tam, aby pokazać, co próbuję zrobić.Odbicie C# get Field lub Property o nazwie

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); 
} 

Słyszałem o czymś zwanym dynamicznym LINQ, które mogą być używane, ale dla dobra nauki, robię to po swojemu.

+2

Operator koalescencji zerowej nie działa, ponieważ 'FieldInfo' nie jest' PropertyInfo'. Użyj 'as', aby je rzucić. – FlyingStreudel

Odpowiedz

12

Zmiana ta linia:

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

do tego:

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

bo nie ma niejawny oddanych do klasy bazowej przy użyciu trójoperandowy operator takiego. Trójskładnik wymaga, aby typy wszystkich wyników były takie same.

+4

To nie jest operator trójskładnikowy, to operator koalescencyjny. –

+1

Poza tym ... nazwa to * operator warunkowy * –

+0

@MichaelPerrenoud Może to być prawda, ale są one oddzielnymi operatorami w specyfikacji języka. Operator odejmowania może być cukrem syntaktycznym dla negacji i dodawania, ale jeśli tak, czy nazwałbyś go operatorem dodawania? (A specyfikacja wspomina "operator trójskładnikowy" jako alternatywną nazwę operatora warunkowego.) –