Как получить доступ к свойству 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
?
Я бы предпочел не делать этого, если смогу, поскольку этот метод вызывается только в одном месте, и создание объекта выброса кажется излишним.
Ответы
Ответ 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()