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.
Operator koalescencji zerowej nie działa, ponieważ 'FieldInfo' nie jest' PropertyInfo'. Użyj 'as', aby je rzucić. – FlyingStreudel