2013-04-30 12 views
8

C'è un modo per fornire un nome a una funzione che restituisce il valore del campo o della proprietà su un determinato oggetto con quel nome? Ho cercato di aggirarlo con l'operatore null-coalesce, ma a quanto pare non mi piacciono i diversi tipi (che è anche un po 'strano per me perché null è null). Potrei separarlo in se nulli, ma ci deve essere un modo migliore per farlo. Ecco la mia funzione e le due righe con gli oggetti Comparison non vengono compilate, ma le lascerò lì per mostrare ciò che sto cercando di fare.C# Riflettere ottenere campo o proprietà per nome

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

Ho sentito parlare di una cosa chiamata LINQ dinamica che potrebbe essere utilizzato, ma per il bene di apprendimento, lo faccio a modo mio.

+2

L'operatore null coalescente non funziona perché un 'FieldInfo' non è un' PropertyInfo'. Usa 'as' per lanciarli. – FlyingStreudel

risposta

12

Modifica questa linea:

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

a questo:

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

perché non c'è cast implicito alla classe di base quando si utilizza l'operatore ternario in quel modo. Il ternario richiede che i tipi di tutte le uscite siano uguali.

+4

Questo non è l'operatore ternario, è l'operatore a coalescenza nulla. –

+1

Inoltre ... il nome è l'operatore * condizionale * –

+0

@MichaelPerrenoud Questo potrebbe essere vero, ma sono operatori separati nelle specifiche della lingua. L'operatore di sottrazione potrebbe essere zucchero sintattico per una negazione e un'aggiunta, ma in tal caso, lo chiameresti l'operatore addizione? (E la specifica menziona "operatore ternario" come nome alternativo per l'operatore condizionale). –

Problemi correlati