0

私のプロジェクトでは、Telerik RadGridView コントロールを使用しています。その ItemSource は動的オブジェクトのリストです (DynamicObject から派生)。
SumFunction、MinFunction などの AggregateFunctions を使用する予定でしたが、動的プロパティから値を取得している列でクラッシュしています。私が正しければ、それは Telerik ではなく Linq 拡張機能によるものです。
この問題の回避策はありますか?

モデルクラスの更新
は次のようになります

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' は、指定された型引数および引数と互換性がありません。メソッドが非ジェネリックの場合は、型引数を指定しないでください。

4

1 に答える 1

4

独自の集計関数を作成し、その中に式を手動で作成することで、この問題を解決しました (ソース: Telerik サポート)。
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);
    }
}
于 2013-10-04T18:26:51.323 に答える