2013-10-03 39 views
0

在我的項目中,我使用Telerik RadGridView控件,其中的ItemSource是動態對象(從DynamicObject派生)的列表。
我打算使用AggregateFunctions,就像SumFunction,MinFunction一樣,但它正在從動態屬性獲取值的列中崩潰。如果我是正確的,那是因爲Linq擴展,而不是Telerik。
有沒有解決這個問題的方法?是否可以使用動態類型Enumerable.Sum()擴展?

更新
模型類看起來像這樣

public class SampleModel : DynamicObject 
{ 
    // some properties 
} 

來源是這樣的:

myGrid.ItemsSource = new List<SampleModel> { // some model items }; 

XAML是:

<telerik:RadGridView ShowColumnFooters="True" AutoGenerateColumns="False" x:Name="myGrid"> 
     <telerik:RadGridView.Columns> 
      <telerik:GridViewDataColumn DataMemberBinding="{Binding p1}"> 
       <telerik:GridViewDataColumn.AggregateFunctions> 
        <telerik:SumFunction /> 
       </telerik:GridViewDataColumn.AggregateFunctions> 
      </telerik:GridViewDataColumn> 
     </telerik:RadGridView.Columns> 
    </telerik:RadGridView> 

P1是動態屬性
異常消息是:
類型'System.Linq.Enumerable'的泛型方法'Sum'與提供的類型參數和參數兼容。如果方法是非泛型的,則不應提供類型參數。

+0

請出示能重現問題和詳細的異常(而不是「崩潰列」語句)代碼。 –

+0

@Alexei我將添加樣本和異常消息作爲更新的問題。 –

回答

2

我通過手動創建自己的聚合函數和構建表達式來解決此問題(來源:Telerik support)。
代碼sum()函數是:

public class CustomSumFunction : EnumerableSelectorAggregateFunction 
{ 
    protected override string AggregateMethodName 
    { 
     get { return "Sum"; } 
    } 

    protected override Type ExtensionMethodsType 
    { 
     get 
     { 
      return typeof(CustomAggregateFunctions); 
     } 
    } 
} 

public static class CustomAggregateFunctions 
{ 
    public static TValue Sum<T, TValue>(IEnumerable<T> source, Func<T, TValue> selector) 
    { 

     return source.Select(selector).Aggregate((t1, t2) => 
      { 
       Expression expr = Expression.Add(Expression.Constant(t1, t1.GetType()), Expression.Constant(t2, t2.GetType())); 
       Expression conversion = Expression.Convert(expr, typeof(TValue)); 
       return Expression.Lambda<Func<TValue>>(conversion).Compile()();      
      }); 
    } 

    public static decimal? Sum<TSource>(IEnumerable<TSource> source, Func<TSource, decimal?> selector) 
    { 
     return source.Sum(selector); 
    } 

    public static decimal Sum<TSource>(IEnumerable<TSource> source, Func<TSource, decimal> selector) 
    { 
     return source.Sum(selector); 
    } 

    public static double? Sum<TSource>(IEnumerable<TSource> source, Func<TSource, double?> selector) 
    { 
     return source.Sum(selector); 
    } 

    public static double Sum<TSource>(IEnumerable<TSource> source, Func<TSource, double> selector) 
    { 
     return source.Sum(selector); 
    } 

    public static float? Sum<TSource>(IEnumerable<TSource> source, Func<TSource, float?> selector) 
    { 
     return source.Sum(selector); 
    } 

    public static float Sum<TSource>(IEnumerable<TSource> source, Func<TSource, float> selector) 
    { 
     return source.Sum(selector); 
    } 

    public static int? Sum<TSource>(IEnumerable<TSource> source, Func<TSource, int?> selector) 
    { 
     return source.Sum(selector); 
    } 

    public static int Sum<TSource>(IEnumerable<TSource> source, Func<TSource, int> selector) 
    { 
     return source.Sum(selector); 
    } 

    public static long? Sum<TSource>(IEnumerable<TSource> source, Func<TSource, long?> selector) 
    { 
     return source.Sum(selector); 
    } 

    public static long Sum<TSource>(IEnumerable<TSource> source, Func<TSource, long> selector) 
    { 
     return source.Sum(selector); 
    } 
} 
相關問題