Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 20.01.2014
Сообщений: 259

Как обратиться к свойству объекта зная его порядковый номер?

05.02.2020, 19:37. Показов 4849. Ответов 33

Студворк — интернет-сервис помощи студентам
У меня есть список из объектов AbrechnungenDTO, а в dtParams есть поле с номером столбца по которому надо отсортировать... То есть если "0" то по ev.ID, если "1" то по ev.DepotID, если "2" то по ev.DepotBezeichnung и т.д.... В приведенном ниже коде я сортирую по нулевому столбцу
abrechnungenList = abrechnungenQ.OrderBy(ev => ev.ID).Skip(dtParams.Start)
.Take(dtParams.Length).ToList();

а мне нужно по столбцу, который соответствует номеру, который я получаю из dtParams.Order[0].Column???
Воот... Я запутался, спасибо всем кто откликнется...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
public string GetDtFlatexAbrechnungen(DtParamsDTO dtParams)
        {
            IQueryable<AbrechnungenDTO> abrechnungenQ = null;
            List<AbrechnungenDTO> abrechnungenList = null;
 
            int count;
 
            using (BOBEntities bobDb = bobFac.Create())
            {
                abrechnungenQ = from ev in bobDb.Import_Flatex_Abrechnungen
                                        where ev.Handelstag >= dtParams.FilterDatumVon &&
                                              ev.Handelstag <= dtParams.FilterDatumBis
                                 select new AbrechnungenDTO
                                 {
                                     ID = ev.ID,
                                     DepotID = ev.DepotID,
                                     DepotBezeichnung = ev.DepotBezeichnung,
                                     Plattform = ev.Plattform,
                                     Bezeichnung = ev.Bezeichnung,
                                     Handelstag = ev.Handelstag,
                                     ISIN = ev.ISIN,
                                     Geschaeftsart = ev.Geschaeftsart,
                                     Stueckzahl = ev.Stueckzahl,
                                     Kurswaehrung = ev.Kurswaehrung,
                                     Kurs = ev.Kurs,
                                     Abrechnungswaehrung = ev.Abrechnungswaehrung,
                                     GebuehrenGesamt = ev.GebuehrenGesamt,
                                     GebuehrFGEB = ev.GebuehrFGEB,
                                     GebuehrCOU = ev.GebuehrCOU,
                                     GebuehrTRA = ev.GebuehrTRA,
                                     GebuehrRGSFGEB = ev.GebuehrRGSFGEB,
                                     GebuehrSDFGEB = ev.GebuehrSDFGEB,
                                     GebuehrAA = ev.GebuehrAA,
                                     GebuehrIGEB = ev.GebuehrIGEB,
                                     GebuehrTRFGEB = ev.GebuehrTRFGEB,
                                     GebuehrRGGFGEB = ev.GebuehrRGGFGEB,
                                     GebuehrSNFGEB = ev.GebuehrSNFGEB,
                                     GebuehrBON = ev.GebuehrBON,
                                     GebuehrUMLFGEB = ev.GebuehrUMLFGEB,
                                     GebuehrTRS = ev.GebuehrTRS,
                                     GebuehrTRSRGEB = ev.GebuehrTRSRGEB,
                                     GebuehrABGEB = ev.GebuehrABGEB,
                                     GebuehrVERGEB = ev.GebuehrVERGEB,
                                     GebuehrSonstige = ev.GebuehrSonstige,
                                     ValutaDatum = ev.ValutaDatum,
                                     CancelReverse = ev.CancelReverse,
                                     OrderNummer = ev.OrderNummer,
                                     Waehrungssatz = ev.Waehrungssatz,
                                     Folio = ev.Folio,
                                     Handelszeitpunkt = ev.Handelszeitpunkt,
                                     Stueckzins = ev.Stueckzins,
                                     Zinstage = ev.Zinstage,
                                     Einheitswaehrung = ev.Einheitswaehrung,
                                     WKN = ev.WKN,
                                     Waehrungsfixingzeitpunkt = ev.Waehrungsfixingzeitpunkt,
                                     GeschaeftsnummerSN = ev.GeschaeftsnummerSN
                                 };
 
                abrechnungenQ = FilterAnwenden(dtParams, abrechnungenQ);
 
                count = abrechnungenQ.Count();
                abrechnungenList = abrechnungenQ.OrderBy(ev => ev.ID).Skip(dtParams.Start)
                            .Take(dtParams.Length).ToList();
            }  
            //ResultObj erstellen
            var resultDtObj = new
            {
                draw = dtParams.Draw,
                recordsTotal = count,
                recordsFiltered = count,
                data = abrechnungenList
            };
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.02.2020, 19:37
Ответы с готовыми решениями:

Обратиться к свойству объекта, зная имя свойства в виде строки
Доброе время суток. Я пытаюсь обратиться к свойству объекта, имея его наименование в виде строки. Можно ли как-то провернуть нечто...

Как получить символ из строки зная его порядковый номер?
AnsiString chr = &quot;ÉÖÓÊÅÍÃØÙÇÕÚÔÛÂÀÏÐÎËÄÆÝß×ÑÌÈÒÜÁÞ.,7418529630 &quot;; // 012 AnsiString m = chr.&quot;символ_номер&quot;(2); ...

Как обратиться к свойству объекта в массиве?
у меня есть массив объектов object obj = new object; product audi = new product(45000, &quot;Audi A6&quot;, &quot;Germany&quot;); ...

33
 Аватар для Arthur Progy
251 / 167 / 94
Регистрация: 16.09.2019
Сообщений: 457
05.02.2020, 20:10
Lego9, Можно в свойствах хранить 2 параметра, первый порядковый номер свойства, а второй значение параметра.

Добавлено через 48 секунд
Как-то так
C#
1
2
3
4
5
6
7
public class Test
    {
        public (int, string) Prop1 { get; set; }
        public (int, object) Prop2 { get; set; }
        public (int, byte) Prop3 { get; set; }
        public (int, DateTime) Prop4 { get; set; }
    }
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
05.02.2020, 20:23
Цитата Сообщение от Lego9 Посмотреть сообщение
То есть если "0" то по ev.ID, если "1" то по ev.DepotID, если "2" то по ev.DepotBezeichnung и т.д....
Создайте словарик, где ключ - порядковый номер свойства, а значения - делегат Func<AbrechnungenDTO, object>. И наполните его ручками.
C#
1
2
3
4
5
static Dictionary<int, Func<AbrechnungenDTO, object>> MapColumnNumberToProp = new Dictionary<...>() { 
   {0, new Func(x => x.ID)}, 
   {1, new Func(x => x.DepotID)}, 
    ....
 }


C#
1
2
abrechnungenList = abrechnungenQ.OrderBy(ev => MapColumnNumberToProp[dtParams.Order[0].Column]).Skip(dtParams.Start)
                            .Take(dtParams.Length).ToList();

Скорее вызвать надо,
C#
1
OrderBy(ev => MapColumnNumberToProp[dtParams.Order[0].Column](ev)).Skip(dtParams.Start).Take(dtParams.Length).ToList();
Как-то так.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
05.02.2020, 20:30
Лучший ответ Сообщение было отмечено Lego9 как решение

Решение

Цитата Сообщение от Lego9 Посмотреть сообщение
Воот... Я запутался, спасибо всем кто откликнется...
А что такое "номер свойства"?
В C# такого понятия нет.
Поэтому дефолтно реализовать это не выйдет.
Для этого надо задать, что такое номер свойства.
Для идентификации номера и геттера свойства можно использовать либо словарь, либо, если номера идут без пропуска, массив.

Пример
C#
1
2
3
4
5
6
7
8
        private Func<AbrechnungenDTO, object>[] getters =
        {
               abr => abr.ID,
               abr => abr.DepotID,
               abr => abr.DepotBezeichnung,
               abr => abr.Plattform,
               //......
        };
C#
1
2
3
                int num = 3;
                abrechnungenList = abrechnungenQ.OrderBy(getters[num]).Skip(dtParams.Start)
                            .Take(dtParams.Length).ToList();
Использование
1
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
05.02.2020, 20:31
Эм, если материализация IQuerable то скорее всего на вход нужен будет Expression<Func<AbrechnungenDTO, object>>>, то есть тип entries в словаре поменять на этот:
C#
1
2
3
4
5
static Dictionary<int, Expression<Func<AbrechnungenDTO, object>>> MapColumnNumberToProp = new Dictionary<...>() { 
   {0, x => x.ID}, 
   {1, x => x.DepotID}, 
    ....
 }
Тут могу ошибаться.
0
0 / 0 / 0
Регистрация: 20.01.2014
Сообщений: 259
06.02.2020, 12:04  [ТС]
Спасибо всем откликнувшимся. Сейчас буду разбираться. Словарики никогда не делал и никогда не использовал...
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для идентификации номера и геттера свойства можно использовать либо словарь, либо, если номера идут без пропуска, массив.
Поясните пожалуйста как это можно реализовать..

Добавлено через 15 минут
IamRain,
спасибо только что то тут не так, я с подобным не сталкивался
Цитата Сообщение от IamRain Посмотреть сообщение
static Dictionary<int, Func<AbrechnungenDTO, object>> MapColumnNumberToProp = new Dictionary<...>() {
   {0, new Func(x => x.ID)},
   {1, new Func(x => x.DepotID)},
    ....
 }
VS ругается подчеркивает Func красным... требует 1 аргумент... я к сожалению не понимаю...

Добавлено через 5 минут
Цитата Сообщение от IamRain Посмотреть сообщение
static Dictionary<int, Expression<Func<AbrechnungenDTO, object>>> MapColumnNumberToProp = new Dictionary<...>() {
   {0, x => x.ID},
   {1, x => x.DepotID},
    ....
 }
Так тоже ругается... {0, x => x.ID} подчеркивает красным

Добавлено через 13 минут
Элд Хасп, Cкажите пожалуйста, а почему нельзя
Цитата Сообщение от Элд Хасп Посмотреть сообщение
private Func<AbrechnungenDTO, object>[] getters =
        {
               abr => abr.ID,
               abr => abr.DepotID,
               abr => abr.DepotBezeichnung,
               abr => abr.Plattform,
               //......
        };
сделать public и расположить в классе AbrechnungenDTO? VS тоже ругается...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
06.02.2020, 12:41
Цитата Сообщение от Lego9 Посмотреть сообщение
сделать public и расположить в классе AbrechnungenDTO? VS тоже ругается...
Можно, если у вас есть доступ к коду класса AbrechnungenDTO, то это даже лучшее решение.
Надо тогда его сделать ещё и stastic.
И даже больше, если это ваш класс и вы можете менять его код, то можно добавить в него индексатор, а будет, вообще, красивое решение.
0
0 / 0 / 0
Регистрация: 20.01.2014
Сообщений: 259
06.02.2020, 12:50  [ТС]
Ох господа, с каким огромным скрипом в меня всё это проникает... Скажите а как мне ещё направление сортировки подтянуть? Оно находится в dtParams.Order[0].Dir.. То есть в dtParams.Order[0].Column лежит номер колонки, 1 или 2, или 3, итд ... А в dtParams.Order[0].Dir лежит направление "asc" или "desc". Как мне направление задействовать?

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И даже больше, если это ваш класс и вы можете менять его код, то можно добавить в него индексатор, а будет, вообще, красивое решение.
Объясните пожалуйста, это как?

Добавлено через 3 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Можно, если у вас есть доступ к коду класса AbrechnungenDTO, то это даже лучшее решение.
Надо тогда его сделать ещё и stastic.
Не дает, все равно подчеркивает красным и пишет, что ему нужно поле для этого. Что это значит?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
06.02.2020, 13:49
Цитата Сообщение от Lego9 Посмотреть сообщение
Объясните пожалуйста, это как?
Пример класса
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    public class AbrechnungenDTO
    {
 
        public static ReadOnlyCollection<Func<AbrechnungenDTO, object>> Getters { get; }
 
        static AbrechnungenDTO()
        {
 
            Getters = Array.AsReadOnly(new Func<AbrechnungenDTO, object>[]
            {
               abr => abr.ID,
               abr => abr.DepotID,
               abr => abr.DepotBezeichnung,
               abr => abr.Plattform,
               abr => abr.Bezeichnung,
               abr => abr.Handelstag,
            });
 
 
        }
 
        public AbrechnungenDTO()
        {
        }
 
        public int ID { get; set; }
        public int DepotID { get; set; }
        public string DepotBezeichnung { get; set; }
        public string Plattform { get; set; }
        public string Bezeichnung { get; set; }
        public string Handelstag { get; set; }
 
        public object this[int index] => Getters[index](this);
    }
Пример использования
C#
1
2
3
4
5
6
7
8
9
            List<AbrechnungenDTO> abrechnungenList = new List<AbrechnungenDTO>();
 
            /// Инициализация списка abrechnungenList
 
            int indexProperty = 3;
 
            var ord = abrechnungenList.OrderBy(AbrechnungenDTO.Getters[indexProperty]);
            /// второй вариант
            var ord2 = abrechnungenList.OrderBy(x => x[indexProperty]);
Добавлено через 59 секунд
Цитата Сообщение от Lego9 Посмотреть сообщение
Не дает, все равно подчеркивает красным и пишет, что ему нужно поле для этого. Что это значит?
Покажите как вы это прописали.
1
0 / 0 / 0
Регистрация: 20.01.2014
Сообщений: 259
06.02.2020, 13:54  [ТС]
Элд Хасп, Aх, огромное спасибо. Уже лучше. Не могли бы вы мне на простом языке проговорить вот эту строчку:
Цитата Сообщение от Элд Хасп Посмотреть сообщение
public static ReadOnlyCollection<Func<AbrechnungenDTO, object>> Getters { get; }
Типа, здесь мы объявляем статическое свойство объекта, которое.... Вот что идет за словом которое?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
06.02.2020, 13:56
Цитата Сообщение от Lego9 Посмотреть сообщение
То есть в dtParams.Order[0].Column лежит номер колонки, 1 или 2, или 3, итд ... А в dtParams.Order[0].Dir лежит направление "asc" или "desc". Как мне направление задействовать?
В самом OrderBy это организовать сложно, так как надо будет передавать в OrderBy экземпляр компаратора.
А у вас даже создание простого массива или словаря вызывает проблемы.
Поэтому проще будет по условию "asc" или "desc" обращаться к методам OrderBy или OrderByDescending.
Или после OrderBy реверсировать последовательность - Reverse().

Но если есть желание можно создать и нормальный компаратор, который всё это будет делать сам.
0
0 / 0 / 0
Регистрация: 20.01.2014
Сообщений: 259
06.02.2020, 13:57  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Покажите как вы это прописали.
Я прописал это совершенно не верно:
типа:
C#
1
2
3
4
5
6
7
8
static Func<AbrechnungenDTO, object>[] getters =
        {
               abr => abr.ID,
               abr => abr.DepotID,
               abr => abr.DepotBezeichnung,
               abr => abr.Plattform,
               //......
        };
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
06.02.2020, 14:00
IComparer<T> Интерфейс

Добавлено через 2 минуты
Цитата Сообщение от Lego9 Посмотреть сообщение
Типа, здесь мы объявляем статическое свойство объекта, которое.... Вот что идет за словом которое?
Коллекция только для чтения.
Получается из обычного массива методом Array.AsReadOnly(массив)
Это неизменяемая коллекция, чтобы гарантировать защиту от случайных ошибок изменяющих значение её элементов.
1
0 / 0 / 0
Регистрация: 20.01.2014
Сообщений: 259
06.02.2020, 14:01  [ТС]
Элд Хасп, Я в итоге подсмотрел в соседнем проекте и сделал вот так...:
Нужно подключить System.Linq.Dynamic;
В пространстве имен класса AbrechnungenDTO:
C#
1
2
3
4
5
6
7
8
9
10
11
public enum DicAbrechnungen
    {
        ID = 0,
        DepotID = 1,
        DepotBezeichnung = 2,
        Plattform = 3,
        Bezeichnung =4,
        Handelstag = 5,
        ISIN = 6,
        Geschaeftsart = 7
    }
В контроллере:
C#
1
2
3
abrechnungenList = abrechnungenQ.OrderBy((DicAbrechnungen)dtParams.Order.First().Column + " " + dtParams.Order.First().Dir)
                                        .Skip(dtParams.Start)
                                        .Take(dtParams.Length).ToList();
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
06.02.2020, 14:03
Цитата Сообщение от Lego9 Посмотреть сообщение
Я прописал это совершенно не верно:
типа:
Перед static надо было добавить public.
И всегда ставьте модификаторы доступности public, internal, protected, private - это гарантирует от случайных ошибок.
Возьмите это за привычку.

Добавлено через 1 минуту
Цитата Сообщение от Lego9 Посмотреть сообщение
Я в итоге подсмотрел в соседнем проекте и сделал вот так...:
Если вас устраивает - используйте.
1
0 / 0 / 0
Регистрация: 20.01.2014
Сообщений: 259
06.02.2020, 14:09  [ТС]
Элд Хасп, Все равно огромное спасибо! Вы не могли бы тем не менее мне пояснить Ваш код! Очень хочется понять! И что мне нужно нажать, что бы у Вас был + в карме?

Добавлено через 5 минут
Цитата Сообщение от Lego9 Посмотреть сообщение
Сообщение от Элд Хасп
public static ReadOnlyCollection<Func<AbrechnungenDTO, object>> Getters { get; }
Типа, здесь мы объявляем статическое свойство объекта, которое.... Вот что идет за словом которое?
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сообщение от Lego9
Типа, здесь мы объявляем статическое свойство объекта, которое.... Вот что идет за словом которое?
Коллекция только для чтения.
Получается из обычного массива методом Array.AsReadOnly(массив)
Это неизменяемая коллекция, чтобы гарантировать защиту от случайных ошибок изменяющих значение её элементов.
Мне к сожалению не понятно что стоит в угловых скобках? Правда, я начинающий что это? что мы возвращаем? Почему два типа в скобках? Чуть-чуть подробнее..
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
06.02.2020, 14:17
Цитата Сообщение от Lego9 Посмотреть сообщение
Вы не могли бы тем не менее мне пояснить Ваш код! Очень хочется понять!
Без проблем - задавайте вопросы.
Но он больше рассчитан на методы расширения IEnumerable LINQ.
Как он себя поведёт с IQueryable я точно не знаю.
Суть в том, что для IQueryable надо так составлять LINQ чтобы он выполнялся сервером без конвертации в IEnumerable.
Методы IEnumerable будут выполняться уже клиентским приложением.

Цитата Сообщение от Lego9 Посмотреть сообщение
И что мне нужно нажать, что бы у Вас был + в карме?
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
06.02.2020, 14:26
Цитата Сообщение от Lego9 Посмотреть сообщение
Мне к сожалению не понятно что стоит в угловых скобках? Правда, я начинающий что это? что мы возвращаем? Почему два типа в скобках? Чуть-чуть подробнее..
Угловые скобки это уточнение обобщённого типа.

Допустим у нас есть тип List<T>.
Объявляя его мы уточняем тип T: List<int> list = ....;
Так же мы можем объявить список списков: List<List<int>> listList = ....
В таком случае переменная listList имеет тип List<List<int>>, каждый её элемент имеет тип List<int>, а элемент элемента имеет тип int. Обращение к элементу нижнего уровня делается как в ступенчатом массиве int num = listList[index1][index2];


В моём же примере нужны элементы имеющие тип делегата функции с типом Func<AbrechnungenDTO, object>.
Это означает, что функция принимает на вход один параметр типа AbrechnungenDTO, а возвращает значение типа object (то есть любого типа).
ReadOnlyCollection<> - означает что эти делегаты собраны в неизменяемую коллекцию с целочисленным индексатором, по простому в неизменяемый массив.
1
0 / 0 / 0
Регистрация: 20.01.2014
Сообщений: 259
06.02.2020, 18:06  [ТС]
Элд Хасп,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class AbrechnungenDTO
{
 
    public static ReadOnlyCollection<Func<AbrechnungenDTO, object>> Getters { get; }
 
    static AbrechnungenDTO()
    {
 
        Getters = Array.AsReadOnly(new Func<AbrechnungenDTO, object>[]
        {
           abr => abr.ID,
           abr => abr.DepotID,
           abr => abr.DepotBezeichnung,
           abr => abr.Plattform,
           abr => abr.Bezeichnung,
           abr => abr.Handelstag,
        });
 
 
    }
 
    public AbrechnungenDTO()
    {
    }
 
    public int ID { get; set; }
    public int DepotID { get; set; }
    public string DepotBezeichnung { get; set; }
    public string Plattform { get; set; }
    public string Bezeichnung { get; set; }
    public string Handelstag { get; set; }
 
    public object this[int index] => Getters[index](this);
}
Что-то я всё равно с трудом.((( Поправьте меня. Класс AbrechnungenDTO, имеет статическое поле,public static ReadOnlyCollection<Func<AbrechnungenDTO, object>> Getters { get; }.
ReadOnlyCollection, это коллекция элементов типа - Func<AbrechnungenDTO, object>.
Могла бы быть типа string или List, а она вот такого типа -Func<AbrechnungenDTO, object>. А вот тут мне не понятно. .. Func<AbrechnungenDTO, object>. Это что? Это предикат? В книжке написано, что это делегат типа Func. A зачем он? Говоря простым человеческим языком что мы тут велим сделать коду? Я простите не занудничаю и не пытаюсь спорить, мне просто искренне не понятно пока я это простым языком не проговорю...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static AbrechnungenDTO()
    {
 
        Getters = Array.AsReadOnly(new Func<AbrechnungenDTO, object>[]
        {
           abr => abr.ID,
           abr => abr.DepotID,
           abr => abr.DepotBezeichnung,
           abr => abr.Plattform,
           abr => abr.Bezeichnung,
           abr => abr.Handelstag,
        });
 
 
    }
Это здесь что? Это статический конструктор? Что мы велим сделать? Мы в наше статическое поле Getters, о котором я говорил выше записываем что? Массив только для чтения? Где каждым элементом массива является лямбда выражение? Да? И все же зачем делегат? Или все таки предикат? Зачем он?
C#
1
public object this[int index] => Getters[index](this);
Что вот это такое? Я такой записи вообще никогда не видел. Мы говорим, что у нашего класса AbrechnungenDTO есть поле типа object, а дальше не понимаю, где имя? где что?
Простите за такой нубский подход. Но я не знаю как мне иначе понять. Тут кода меньше чем у меня текста в вопросе....
Спасибо.

Добавлено через 16 минут
И еще, вы меня не проконсультируете. У меня приложение, Бутстрэп + Ангуляр + с#. Коллега отбывая в отпуск сказал, что состояние кнопок на странице мы запоминаем с помощью LocalStorfge. Я посмотрел в старом проекте и ничего не понял... Понял, что local-storage.js мне устанавливать не надо. Ибо в соседнем проекте его нет. Как это работает не понимаю, гуглю, лучше не становится... Вы случайно не в материале? А то тут довольно редко отвечают... Я и так доволен как слон, что столько инфы по первому вопросу собрал...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
06.02.2020, 18:40
Цитата Сообщение от Lego9 Посмотреть сообщение
А вот тут мне не понятно. .. Func<AbrechnungenDTO, object>. Это что? Это предикат?
Это ссылка на метод-функцию которая получает в один параметр типа AbrechnungenDTO и возвращает значение object nbbgf (то есть любого типа).
Это может быть любой метод типа таких
C#
1
2
3
4
5
6
7
8
9
10
11
12
public static object AbrID (AbrechnungenDTO abr)
{
    return abr.ID;
}
public static object AbrDepotID (AbrechnungenDTO abr)
{
    return abr.DepotID;
}
public static object AbrDepotBezeichnung (AbrechnungenDTO abr)
{
    return abr.DepotBezeichnung;
}
В статическом конструкторе я создаю через лябда выражение анонимные методы, аналогичные выше указанным.
Это просто более сокращённая и быстрая запись таких же методов.
C#
1
2
3
4
5
6
7
8
9
10
11
12
    static AbrechnungenDTO()
    {
        Getters = Array.AsReadOnly(new Func<AbrechnungenDTO, object>[]
        {
           AbrID,
           AbrDepotID,
           AbrDepotBezeichnung,
           abr => abr.Plattform,
           abr => abr.Bezeichnung,
           abr => abr.Handelstag,
        });
    }
В первых трёх элементах используется ссылка на заранее созданные методы.
В следующих трёх сразу создаётся анонимный метод и используется ссылка на него. То есть не надо заранее объявлять метод. Что сокращает код.
Такие выкрутасы нужны из-за того, что в C# нельзя получить ссылку на свойство. Приходится создавать методы для получения значения свойства.

Добавлено через 9 минут
Цитата Сообщение от Lego9 Посмотреть сообщение
C#
1
public object this[int index] => Getters[index](this);
Что вот это такое? Я такой записи вообще никогда не видел. Мы говорим, что у нашего класса AbrechnungenDTO есть поле типа object, а дальше не понимаю, где имя? где что?
Это индексатор типа https://metanit.com/sharp/tutorial/4.10.php

возвращаемый_тип this[тип_индекса index] - означает, что в этом типе (this ссылка на экземпляр типа https://docs.microsoft.com/ru-... words/this) объявляется индексатор. Индекс имеет заданный тип и индексатор возвращает указанный тип. Всё аналогично объявлению свойства.

В указанном случае, индексатор имеет только геттер. То есть присвоить значение используя индексатор нельзя.
Геттер индексатора извлекает по указанному индексу метод-функцию из массива Getters. В этот метод передаёт текущий экземпляр себя (экземпляр AbrechnungenDTO для которого используется индекс) и возвращает значение возвращаемое этим методом.

Добавлено через 1 минуту
Цитата Сообщение от Lego9 Посмотреть сообщение
Я простите не занудничаю и не пытаюсь спорить, мне просто искренне не понятно пока я это простым языком не проговорю...
Не надо извиняться и переживать по этому поводу.
Форум и создан с целью поиска ответов на вопросы.
Что не понятно - интересуйтесь, спрашивайте дальше.

Добавлено через 8 минут
Lego9, ещё раз хотел бы уточнить.
Задача получения результата может быть двух разных типов.

Первая, это преобразовать полученные от БД данные (отсортировать, отфильтровать, посчитать и .т.д) в клиенте.
Я вам пишу именно за такой тип задачи.

Второй тип, это получение из БД данных в уже нужном виде. Работа по обработке данных выполняется сервером. Для этого надо или создать самому нужный SQL запрос или создать его средствами Entity Framework используя методы IQueryable. С таким типом задач я сам пока только разбираюсь и не знаю насколько предлагаемый мною подход сможет её решить.

Добавлено через 3 минуты
Цитата Сообщение от Lego9 Посмотреть сообщение
И еще, вы меня не проконсультируете. У меня приложение, Бутстрэп + Ангуляр + с#.
Из этого знаю только C#.
Об остальном даже не слышал...
Я не профессиональный программист.
Начинающий любитель - программирование хобби.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.02.2020, 18:40
Помогаю со студенческими работами здесь

Как обратиться к свойству объекта WPF из метода static класса?
Как обратиться к свойству объекта WPF из метода static класса? Есть окно с меню, надписью и кнопкой &lt;Window...

Обратиться к свойству дочернего объекта
Есть глобальная функция, которая вызывается в нескольких обработчиках linkLabel. Как обратиться к свойству linkLabelN.Text, вызвавшей эту...

Как обратиться к контролу, зная его имя?
У меня в строке хранится имя контрола. Подскажите пожалуйста как можно обращаться к свойствам и методам этого компонента в данном случае.

Обратиться к свойству объекта при помощи FindComponent
Подскажите, если не трудно. В проекте имеется несколько форм: FormSovet1, FormSovet2 и т. д. На каждой есть LabelSov. Нужно получить...

Tkinter - теперь как обратиться к виджету зная его имя?
я немного чайник ... сам вопрос: если я хочу обратиться к виджету, зная его имя, вроди бы как надо использовать nametowidget(name), но я...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru