Динамический / анонимный тип, возвращающий анонимные типы! - PullRequest
0 голосов
/ 02 августа 2010

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

      public static dynamic  getCustomer()
    {
        .....
        var x = from c in customers
                select new {Fname = c.FirstName};

        return x;
    }

, а затем

static void Main(string[] args)
    {
        dynamic x = getCustomer();
        Console.WriteLine(x.First().Fname);
        Console.ReadKey();
    }

но, к сожалению, это не работает, хотя компилируется хорошо,

Я думаю, причина:

Анонимные типы известны в типе компиляции и должны быть заключены в классы, ЗНАЮЩИЕСЯ В ЗАПУСКЕ!, Теперь анонимный тип переносит их информацию во время компиляции, надеясь, что какой-то класс придет и примет эту информацию во время выполнения, но динамический тип неизвестен в время компиляции, так что, передавая анонимный тип через динамический тип, вынуждает анонимный тип терять его информацию / интеллектуальность, я пытался отладить и мог получить нужные данные, но, думаю, это работает только в режиме отладки, или, может быть, я что-то упустил.

Мне было интересно, кто-нибудь заставил его работать или думал об этом?

1 Ответ

2 голосов
/ 02 августа 2010

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

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

Изменить на:

Console.WriteLine(Enumerable.First(x).Fname);

и я ожидаю, что это сработает.

...