Глядя на ваш код, я полагаю, этот бит кода возвращает значение типа V:
s => s.Field<V>(seriesItem.ValueMapping)
, если это так, учитывая, что для типа V нет ограничений (это может бытьчто-нибудь, объект, строка и т. д. и т. д.) компилятор не сможет выяснить, какой из перегруженных методов Enumerable.Sum () вызвать, следовательно, ошибка компилятора.
Предполагая, что тип V известен только во время выполнения (так что вы не можете просто ограничить V до int / decimal / double и т. Д.), Как насчет добавления делегата в метод, который можно использовать для возврата int из объекта типа V?Например:
private ObservableCollection<DataItem> method<T, V>(DataTable dt, SeriesItem seriesItem, FilterValues filter, ObservableCollection<DataItem> chart, Func<V, int> convertV)
{
var result = from t in dt.AsEnumerable()
group t by new { type = t.Field<T>(seriesItem.LabelMapping).ToString().ToUpper() } into g
orderby g.Key.type
select new
{
Item_Type = g.Key.type.ToString(),
Amount = seriesItem.IsSum ? g.Sum(s => convertV(s.Field<V>(seriesItem.ValueMapping))) : g.Count()
};
, тогда вы возлагаете ответственность на вызывающую сторону (которая будет знать типы T и V), чтобы выяснить, как преобразовать V в int.