Анонимный тип как параметр метода - PullRequest
1 голос
/ 21 мая 2009

Моя первая попытка использовать анонимные типы (тест):

    private void button4_Click(object sender, EventArgs e)
    {
        test(new { a = "asd" });
    }

    private void test(string a)
    {
    }

Я получаю сообщение об ошибке "не удалось преобразовать из 'AnonymousType # 1' в 'строку'"

Также я хотел бы знать, как передать анонимный тип, если параметр является строкой []

    private void test(string[] a)
    {
    }

Заранее спасибо!

Ответы [ 5 ]

5 голосов
/ 21 мая 2009

Что-то в вашем дизайне неисправно. Если ваша тестовая функция принимает только строки, вы никогда не сможете передать ей анонимный тип, так же как вы не можете передать тип int, object или любой другой нестроковый тип.

4 голосов
/ 21 мая 2009

a - это строковое свойство для вашего анонимного типа

private void button4_Click(object sender, EventArgs e)
{
    test((new { a = "asd" }).a);
}

private void test(string a)
{
}

Редактировать: Анонимные типы не являются производными от чего-либо, кроме объекта, поэтому вы не можете создать метод, который ожидает параметр анонимного типа.

Редактировать 2: когда вы создаете анонимный тип, компилятор создает совершенно новый тип, основанный на установленных вами свойствах и порядке их появления. Вы не можете создать анонимный тип и использовать его вместо любого другого типа (кроме объекта). Наиболее распространенный сценарий, в котором я их использовал, - для связывания, когда вам нужно сгладить граф объектов.

предупреждение, я ужасно придумываю хорошие примеры сценариев, и это все из памяти! например, если бы у меня был список объектов Person, у которых было свойство name и свойство address, которое содержало адрес улицы и которое необходимо было привязать к списку

var people = new List<Person>()
listbox.TextMember = "Text";
listbox.ValueMember = "Value"
listbox.DataSource = from p in people 
select new { Text = p.Name, Value = p.Address.StreetAddress };
2 голосов
/ 21 мая 2009

Нет чистого способа передачи анонимного типа между методами; ты не должен это делать. Вместо этого создайте реальный тип.

Если вы действительно хотите это сделать, вы можете использовать вспомогательный метод, чтобы неловко подделать его, создав еще один «шаблон» этого типа для приведения к нему позже; см. это и много похожих статей.

РЕДАКТИРОВАТЬ: При ближайшем рассмотрении вы не понимаете, что на самом деле является анонимным типом, поэтому я предлагаю вам принять другие ответы.

0 голосов
/ 12 ноября 2015

Просто наткнулся на этот устаревший вопрос и подумал, что кто-то здесь должен упомянуть о возможности использовать dynamic, начиная с C # 4.0, который идеально подходит для работы с анонимными типами. То есть код может выглядеть так:

private void button4_Click(object sender, EventArgs e)
{
    test(new { a = "asd" });
}

private void test(dynamic obj)
{
    Console.WriteLine(obj.a);
}
0 голосов
/ 21 мая 2009

Это плохо, но работает ...

namespace AnonType
{
    class Program
    {
        static void Main(string[] args)
        {
            var foo = new { a = "123", b = "abc" };

            Anon(foo);
            Console.ReadLine();
        }

        public static void Anon(object o)
        {
            Console.WriteLine(o);
        }
    }
}
...