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.
L'operatore null coalescente non funziona perché un 'FieldInfo' non è un' PropertyInfo'. Usa 'as' per lanciarli. – FlyingStreudel