Как получить доступ к свойству count динамического типа в C # 4.0? - PullRequest
13 голосов
/ 09 июня 2011

У меня есть следующий метод, который возвращает динамический объект, представляющий IEnumerable<'a> ('a = анонимный тип):

    public dynamic GetReportFilesbyStoreProductID(int StoreProductID)
    {
        Report report = this.repository.GetReportByStoreProductID(StoreProductID);

        if (report == null || report.ReportFiles == null)
        {
            return null;
        }

        var query = from x in report.ReportFiles
                    orderby x.DisplayOrder
                    select new { ID = x.RptFileID, Description = x.LinkDescription, File = x.LinkPath, GroupDescription = x.ReportFileGroup.Description };

        return query;
    }

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

        dynamic Segments = Top20Controller.GetReportFilesbyStoreProductID(StoreProductID");

        if (Segments.Count == 0)  // <== Fails because object doesn't contain count.
        {
            ...
        }
  • Как работает ключевое слово dynamic?
  • Как получить доступ к Count свойство IEnumerable анонимного типа?
  • Есть ли способ, которым я могу использовать этот анонимный тип, или мне нужно создать пользовательский объект, чтобы я мог вместо этого передать обратно строго типизированный IEnumerable<myObject>dynamic?

Я бы предпочел не делать этого, если смогу, так как этот метод вызывается только в одном месте, а создание одноразового объекта кажется излишним.

Ответы [ 4 ]

20 голосов
/ 09 июня 2011

Вам необходимо явно вызвать Enumerable.Count ().

IEnumerable<string> segments =
  from x in new List<string> { "one", "two" } select x;

Console.WriteLine(segments.Count());  // works

dynamic dSegments = segments;

// Console.WriteLine(dSegments.Count());  // fails

Console.WriteLine(Enumerable.Count(dSegments));  // works

См. Метод расширения и динамический объект в c # для обсуждения того, почему методы расширения не поддерживаются.путем динамического набора.

(Префикс «d» только для примера кода - пожалуйста, не используйте венгерскую запись!)

Обновление: Лично я бы пошел с @ ответом Магнуса об использовании if (!Segments.Any()) и вернул бы IEnumerable<dynamic>.

5 голосов
/ 09 июня 2011

IEnumerable<T>, возвращаемый этим методом, не имеет свойства Count, поэтому я не знаю, о чем вы говорите. Возможно, вы забыли написать ToList() в конце, чтобы преобразовать его в список, или вы намеревались вызвать метод Count() для IEnumerable<T>?

1 голос
/ 09 июня 2011

Count() необходимо перечислить для завершения сбора, вы, вероятно, хотите:

if (!Segments.Any()) 
{
}

И ваша функция должна возвращать IEnumerable<object> вместо динамического

0 голосов
/ 09 июня 2011

Попробуйте счетчик Linq using System.Linq; Segments.Count ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...