(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);
        }
    }
}

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


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 05.11.2009 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Microsoft Office для дома и учебы 2019 (лицензия ESD)
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год.
Microsoft 365 Business Standard (corporate)
Microsoft Windows Professional 10, Электронный ключ
Microsoft 365 Business Basic (corporate)
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Безопасность компьютерных сетей и защита информации
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Adobe Photoshop: алхимия дизайна
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100