(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Трюки с анонимными типами в C# 3.0 (исходники)

Источник: msdn
Гайдар Магдануров

Представим себе ситуацию, что в мы создали некоторый метод в котором хотели бы использовать список анонимных типов. Например, описываемых вот так:

var beatleJohn = new { FirstName = "John", LastName = "Lennon" };

При этом мы хотим сохранить строгую типизацию списка, поэтому логичным видится использование обобщенного класса List<T>. Однако, возникает вопрос, как нам чисто синтаксически создать обобщенный список не зная имени типа - фактически для нас анонимные типы, как и следует из названия, являются безымянными. Тут нужно вспомнить о технике создания обобщенной коллекции по экземпляру типа элемента коллекции.

Использование этого метода может выглядеть так:

var beatles = (new[] { beatleJohn }).ToList();

В результате мы получаем строго типизированный список, тип которого легко узнать воспользовавшись Console.WriteLine(beatles.GetType()): выводит симпатичное имячко System.Collections.Generic.List`1[<>f__AnonymousType0`2[System.String,System.String]], однако это знание нам просто для интереса и на практике никак не пригодится.

С полученным списком мы можем работать следующим образом:

beatles.Add(new { FirstName = "Paul", LastName = "McCartney" });
beatles.Add(new { FirstName = "George", LastName = "Harrison" });
beatles.Add(new { FirstName = "Ringo", LastName = "Starr" });

foreach (var beatle in beatles)
{
    Console.WriteLine(beatle.FirstName + " " + beatle.LastName);
}

Хорошо, так мы можем создавать обобщенные коллекции анонимных типов, но что мешает воспользоваться этой техникой для...

Перед тем как читать дальше, я прошу слабонервных и легко восприимчивых к грязным трюкам закрыть глаза.

... для того, чтобы возвращать анонимные типы из методов.

Предположим, что у нас есть следующий метод:

static object GetBeatleName() { return new { First = "John", Last = "Lennon" }; }

Метод возвращает некий объект, что замечательно, однако чтобы этим объектом можно было удобно пользоваться, прибегнем к описанному выше методу и определим вспомогательный обобщенный метод для приведения типов:

static T CastType<T>(object obj, T type) { return (T)obj; }

которым воспользуемся так:

var beatle = CastType(obj, new {First = "", Last = ""});

Как и в предыдущем примере мы используем технику типизации экземпляром объекта. В результате можем дальше отлично работать с полученным объектом:

Console.WriteLine("First = {0}, Last = {1}", beatle.First, beatle.Last);

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

Листинг примера 1

using System;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            var beatlesMember = new { FirstName = "John",
                    LastName = "Lennon" };

            var beatlesList = 
                       (new[] { beatlesMember }).ToList();

            beatles.Add(new { FirstName = "Paul",
               LastName = "McCartney" });
            beatles.Add(new { FirstName = "George",
               LastName = "Harrison" });
            beatles.Add(new { FirstName = "Ringo", 
               LastName = "Starr" });

            foreach (var beatle in beatles)
            {
                Console.WriteLine(beatle.FirstName +
                                " " + beatle.LastName);
            }
        }
    }
}

Листинг примера 2

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static object GetBeatleName() {
             return new { First = "John", Last = "Lennon" }; }

        static T CastType<T>(object obj, T type) { 
             return (T)obj; }

        static void Main()
        {
            object obj = GetBeatleName();
            var beatle = CastType(obj, new { First = "",
                       Last = "" });
            Console.WriteLine("First={0}, Last={1}",
                           beatle.First, beatle.Last);
        }
    }
}

Ссылки по теме


 Распечатать »
 Правила публикации »
  Обсудить материал в конференции Microsoft »
Обсудить материал в конференции Дизайн, графика, обработка изображений »
Написать редактору 
 Рекомендовать » Дата публикации: 05.11.2009 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Microsoft Office 365 для Дома 32-bit/x64. 5 ПК/Mac + 5 Планшетов + 5 Телефонов. Подписка на 1 год.
Microsoft Office 365 Бизнес премиум. Подписка на 1 рабочее место на 1 год
Microsoft Visual Studio Professional 2017 Russian Academic OLP 1License NoLevel
Microsoft Windows Home 10 Russian Academic OLP 1 License No Level Legalization GetGenuine
Microsoft Windows Professional 10 Russian Upgrade Academic OLP 1 License No Level
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Безопасность компьютерных сетей и защита информации
Новости ITShop.ru - ПО, книги, документация, курсы обучения
CASE-технологии
Программирование на Microsoft Access
OS Linux для начинающих. Новости + статьи + обзоры + ссылки
Adobe Photoshop: алхимия дизайна
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
Обсуждения в форумах
Как извлечь рисунки из файла Word (40)
Вообще-то есть еще способ - сделать в Word-е Copy рисунка, открыть Microsoft Photo Editor и там:...
 
Пишу программы на заказ профессионально (2249)
Пишу программы на заказ на языках Pascal (численные методы, списки, деревья, прерывания) под...
 
Программист более не звучит гордо (16)
Согласен. Но никак это не относится к тем, кто программирует на ассемблере. Мы - редкость....
 
Пишу программы на Lazarus (20)
Предлагаю разработку программ на заказ. Примеры программ: www.itproportal.ru
 
Специалист по reverse engineering (2)
Предлагаю услуги по реверсу и модификации различных программ.
 
 
 



    
rambler's top100 Rambler's Top100