none
Можно ли передать анонимные методы или поля? RRS feed

  • Вопрос

  • WPF C#

    Добрый день.

    Не знаю как правильно сказать

    Можно ли передать анонимные методы или поля созданные в запросе Linq

                var zagolovok = ObsListData.Where(c => c.IDRa == 5 ).GroupBy(c => c.IDPodRa)
                            .Select(g => new
                            {
                                Name = g.Key,
                                namePDRZD = g.FirstOrDefault().NamePodRaz,
                                nameprdID = g.FirstOrDefault().NumberPodRalD                
                            });

    Далее я хочу namePDRZD  и nameprdID куда то передать. Но автоматически студия не может создать отдельный метод.

    Т.е. это невозможно?

    29 августа 2016 г. 11:32

Ответы

  • Добрый день!

    Данный Linq запрос вернет IEnumerable анонимного типа.

    Вы можете обернуть результат в dynamic. Например вот так:

                var zagolovok = ObsListData.Where(c => c.IDRa == 5 ).GroupBy(c => c.IDPodRa)
                            .Select(g => (dynamic) new
                            {
                                Name = g.Key,
                                namePDRZD = g.FirstOrDefault().NamePodRaz,
                                nameprdID = g.FirstOrDefault().NumberPodRalD                
                            });

    Потом результат можете передать в метод с сигнатурой:

        private void Method(IEnumerable<dynamic> enumerable) {
            enumerable.Select(x => x.namePDRZD);
        }


    • Изменено Pavel Dorovsky 29 августа 2016 г. 12:40
    • Помечено в качестве ответа DevingAs 29 августа 2016 г. 15:36
    29 августа 2016 г. 12:37
  • Добрый день.

    Но лучше, так как вам посоветовали в предыдущем ответе не делать, т.к. это приводит к отказу от строгой типизации.

    Лучше под каждый такой случай сделать тип и работать не с анонимным, а нормальным типом, особенно если вы его передаете куда-то дальше.

    • Помечено в качестве ответа DevingAs 29 августа 2016 г. 15:36
    29 августа 2016 г. 14:10
    Отвечающий

Все ответы

  • Добрый день!

    Данный Linq запрос вернет IEnumerable анонимного типа.

    Вы можете обернуть результат в dynamic. Например вот так:

                var zagolovok = ObsListData.Where(c => c.IDRa == 5 ).GroupBy(c => c.IDPodRa)
                            .Select(g => (dynamic) new
                            {
                                Name = g.Key,
                                namePDRZD = g.FirstOrDefault().NamePodRaz,
                                nameprdID = g.FirstOrDefault().NumberPodRalD                
                            });

    Потом результат можете передать в метод с сигнатурой:

        private void Method(IEnumerable<dynamic> enumerable) {
            enumerable.Select(x => x.namePDRZD);
        }


    • Изменено Pavel Dorovsky 29 августа 2016 г. 12:40
    • Помечено в качестве ответа DevingAs 29 августа 2016 г. 15:36
    29 августа 2016 г. 12:37
  • Добрый день.

    Но лучше, так как вам посоветовали в предыдущем ответе не делать, т.к. это приводит к отказу от строгой типизации.

    Лучше под каждый такой случай сделать тип и работать не с анонимным, а нормальным типом, особенно если вы его передаете куда-то дальше.

    • Помечено в качестве ответа DevingAs 29 августа 2016 г. 15:36
    29 августа 2016 г. 14:10
    Отвечающий
  • Как уже отметили, лучше всего создать отдельный тип и работать с ним.

    Также можно использовать Tuple (кортеж). Он обеспечит строгую типизацию. Правда, вместо говорящих названий свойств будут Item1, Item2 и т. п.

    7 сентября 2016 г. 22:32