Если ваш код знает, что source
будет IEnumerable<MyEntity>
, то приведите его так:
Exports.Add("download1", (IEnumerable<dynamic> source, string format, DataSourceLoadOptionsBase dataOptions, HttpContext context) =>
ExportResult((IEnumerable<MyEntity>)source, format, dataOptions, context));
Если вы хотите использовать шаблон вызова в своем примере, вы можете переместить приведение в ваш помощник по экспорту:
private async Task ExportResult<T>(IEnumerable<dynamic> dynamicSource, string format, DataSourceLoadOptionsBase dataOptions, HttpContext context)
{
var source = (IEnumerable<T>)dynamicSource;
Если источник на самом деле имеет тип IEnumerable<>
, но вы знаете, что все элементы в нем будут иметь тип T
, используйте LINQ Cast вместо этого метод:
private async Task ExportResult<T>(IEnumerable<dynamic> dynamicSource, string format, DataSourceLoadOptionsBase dataOptions, HttpContext context)
{
var source = dynamicSource.Cast<T>();
В любом из этих случаев вы можете подумать, действительно ли dynamic
- это то, что вам нужно. Поскольку IEnumerable<>
является ковариантным, IEnumerable<object>
будет работать так же хорошо во всем коде, которым вы поделились.