Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
NameGrey2
3 / 3 / 1
Регистрация: 01.12.2012
Сообщений: 26
1

Изменение типа параметров в объявлении делегата Func

30.07.2013, 23:13. Просмотров 659. Ответов 1
Метки нет (Все метки)

У меня есть метод, который сортирует присылаемый список по определенному параметру.
К примеру, есть тип
C#
1
2
3
4
5
6
7
public class Student
    {
        public string Name { get; set; }
        public string TestName { get; set; }
        public byte Grade { get; set; }
        public DateTime TestDate { get; set; }
}
Если я хочу отсортировать список записей типа Student по имени, то в коде вызываю свой метод:

C#
1
IEnumerable<Student> newList = sortBy(list,"Name", true);
Вот сам метод:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
IEnumerable<Student> _sortBy(List<Student> list, string sortedField,bool desc)
        {
            Type studentType = typeof(Student);
            MemberInfo studentNameProperty = studentType.GetProperty(sortedField);          
            ParameterExpression param = Expression.Parameter(typeof(Student), "result");
            MemberExpression member = Expression.MakeMemberAccess(param, studentNameProperty);          
            Expression<Func<Student, string>> lambda = Expression<Func<Student,
                string>>.Lambda<Func<Student, string>>(member, param);
            if (desc)
            {
                return list.OrderByDescending(lambda.Compile()); 
            }
            else
            {
                return list.OrderBy(lambda.Compile()); 
            }           
        }
А теперь проблема: если попытаться вызвать сортировку по Оценке(Grade), то наш делегат Func<Student, string> не подойдет. Нам потребуется Func<Student, byte>.
А теперь, собственно, вопрос: Как лучше всего сделать так, чтобы было возможным подставлять делегат с нужным типом?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2013, 23:13
Ответы с готовыми решениями:

Аналог делегата Func<T> без возвращаемого значения
есть ли такой делегат в стандартной библиотеке классов? или может быть есть...

Сохранение делегата и параметров
Добрый день. Помогите написать тело сохранения {названия функции;сериализация...

Не получается создать переменную типа Func<int, void>
не получается создать переменную типа Func&lt;int, void&gt; упорно пишет...

Динамическая правка входного типа делегата в Expression
Есть вот такой костыль от которого не уйти public static int...

Объекту типа делегата не присваивается адрес функции
почему объекту типа делегата: string del(object obj); не присваивается адрес...

1
kolorotur
Эксперт .NET
10499 / 8685 / 2161
Регистрация: 17.09.2011
Сообщений: 14,905
Завершенные тесты: 1
31.07.2013, 10:52 2
У списка есть метод Sort, в который можно передать экземпляр IComparer.
Создаете реализации для разных полей и вперед.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2013, 10:52

Разница лямбда выражения, делегата (\анонимного делегата), методом (\анонимных методов)
Всё просто: В чём отличия: лямбд, делегатов, анонимных делегатов, методов,...

Отличие делегата от делегата с лямбда-выражением
Народ чем отличается Invoke(new Action(() =&gt; button2.IsEnabled = true)); от...

Func<TIn, bool> в Func<TOut, bool>
Подскажите если возможность как-нибудь преобразовать Func&lt;TIn, bool&gt; в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru