Трюки з анонімними типами в C # 3.0 (вихідні коди), Різне, Програмування, статті

Уявімо собі ситуацію, що в ми створили певний метод в якому хотіли б використовувати список анонімних типів. Наприклад, описуваних ось так:


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


При цьому ми хочемо зберегти строгу типізацію списку, тому логічним бачиться використання узагальненого класу List . Однак, виникає питання, як нам чисто синтаксично створити узагальнений список не знаючи імені типу – фактично для нас анонімні типи, як і випливає з назви, є безіменними. Тут потрібно згадати про техніку створення узагальненої колекції по примірнику типу елемента колекції.


Використання цього методу може виглядати так:


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

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*