(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 Visual Studio Professional 2017 Sngl OLP 1License NoLevel
Microsoft Office 365 Бизнес. Подписка на 1 рабочее место на 1 год
Microsoft System Center Standard Core Sngl License/Software Assurance Pack OLP 2Licenses NoLevel CoreLic Qualified
Microsoft Office 365 Профессиональный Плюс. Подписка на 1 рабочее место на 1 год
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Безопасность компьютерных сетей и защита информации
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
OS Linux для начинающих. Новости + статьи + обзоры + ссылки
Вопросы и ответы по MS SQL Server
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
Обсуждения в форумах
Пишу программы на заказ для студентов (193)
Пишу для студентов на с, с++, паскаль в средах ms visual studio, qt, builder, borland c, delphi....
 
Пишу программы на заказ профессионально (2451)
Пишу программы на заказ на языках Pascal (численные методы, списки, деревья, прерывания) под...
 
Excell не печатает :-( (2)
Почему то Excell не печатает страницы в альбомной ориентаций, то есть страница в аольбомной...
 
Пишу программы на заказ (1)
Пишу на языках C#, VB.NET, VBA с использованием WPF, WCF, SQL.
 
Программист для удалённой работы (ASP.NET MVC, C#, MSSQL, AJAX) (2)
предлагаю услуги по разработке web-приложений с использованием таких технологий, как: ASP.NET...
 
 
 



    
rambler's top100 Rambler's Top100