Подтвердить что ты не робот

Как получить доступ к свойству count для динамического типа в С# 4.0?

У меня есть следующий метод, который возвращает динамический объект, представляющий 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?

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

4b9b3361

Ответ 1

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

Ответ 2

Вам нужно будет явно вызвать 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

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

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

Обновление: Лично я бы пошел с @Magnus answer с помощью if (!Segments.Any()) и вернул IEnumerable<dynamic>.

Ответ 3

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

if (!Segments.Any()) 
{
}

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

Ответ 4

Попробуйте подсчитать значение Linq using System.Linq; Segments.Count()