C# Преобразование анонимного объекта с вложенной коллекцией в IEnumerable, предпочтительно с использованием ключевого слова as. - PullRequest
0 голосов
/ 22 января 2020

Мой код получает анонимный объект, созданный другим методом. Я хотел бы получить доступ и пройти через вложенную коллекцию в этом объекте. Я пытался придумать несколько разных способов его приведения с использованием ключевого слова «as», но безрезультатно.

Вот код, который создает объект:

            var result = new object();
            foreach (var item in items)
            {
                result = new
                {
                    Variants = item.Value.Select(m => m.Item2).GroupBy(n => n.Item1).Select(r => new
                    {
                        Name = r.Key,
                        Items = r.Select(p => new
                        {
                            Value = p.Item2.Trim(),
                            Text = p.Item2.Substring(0, p.Item2.LastIndexOf('_')).Trim()
                        }).Where(p => !string.IsNullOrEmpty(p.Text)).ToList()
                    })
                };
            }

Visual Studio дает мне следующую подпись при наведении курсора на переменную, которая получила этот анонимный тип:

{ Variants = {System.Linq.Enumerable.WhereSelectEnumerableIterator<System.Linq.IGrouping<string, System.Tuple<string, string>>, <>f__AnonymousType1<string, System.Collections.Generic.List<<>f__AnonymousType2<string, string>>>>} }

Короче говоря: я хотел бы получить доступ к полям Text коллекции.

Вот окно QuickWatch, показывающее структуру и данные этого объекта: Окно QuickWatch

Буду признателен за любую помощь!

PS: Не могу изменить код в методе отправки.

1 Ответ

0 голосов
/ 22 января 2020

Если у вас нет класса c класса, который вы не можете использовать в нем. Для анонимных типов, имеющих свой тип, это означает, что вы либо используете его локально в методе, либо получаете в качестве параметра обобщенного c метода - здесь тоже не так.

Вы действительно ограничены каким-либо отражением копаться в анонимном классе. Самый простой способ - позволить среде выполнения работать с отражением, полагаясь на dynamic вроде ((dynamic)myVariable).Text.

...