2011-09-12 17 views
4

次のコードは正常に動作します(それが一般的なのOrderByを構築します):非特定のタイプ

public class Item 
{ 
    public int Value { get; set; } 
    public string Name { get; set; } 
} 

var _List = new List<Item> 
{ 
    new Item{ Name = "Smith", Value = 3}, 
    new Item{ Name = "Smith", Value = 2}, 
    new Item{ Name = "Wesson", Value = 1}, 
    new Item{ Name = "Wesson", Value = 4}, 
}.AsQueryable<Item>(); 

var _Type = typeof(Item); 

// OrderBy 
var _OrderByProperty = _Type.GetProperty("Value"); 
var _OrderByParameter = Expression.Parameter(typeof(Item), "x"); 
// OrderBy(x => x.Value) 
var _OrderByBody = Expression.Property(_OrderByParameter, _OrderByProperty.Name); 
var _OrderByLambda = Expression.Lambda<Func<Item, Int32>> 
    (_OrderByBody, _OrderByParameter); 
// apply the OrderBy 
_List = _List.OrderBy(_OrderByLambda); 

しかし、私はこのように、この行を変更したいとwoud:

var _OrderByLambda = Expression.Lambda<Func<Item, object>> 
    (_OrderByBody, _OrderByParameter); 

このような変更により、順序付けられた列のデータ型が汎用化されます。次の例外ではしかし、そのような変更の結果:型「可能System.Int32」の

式は、戻り値の型「System.Objectの」

任意のアイデアのために使用することができないのですか?

EDITが、これは正常に動作し、あなたの答えをありがとう:

var _OrderByProperty = _Type.GetProperty("Value"); 
var _OrderByParameter = Expression.Parameter(typeof(Item), "x"); 
// OrderBy(x => x.Value) 
var _OrderByBody = Expression.Property(_OrderByParameter, _OrderByProperty.Name); 
var _OrderByConverted = Expression.Convert(_OrderByBody, typeof(object)); 
var _OrderByLambda = Expression.Lambda<Func<Item, object>> 
    (_OrderByConverted, _OrderByParameter); 
// apply the OrderBy 
_List = _List.OrderBy(_OrderByLambda); 

答えて

6

あなたは体の戻り値の型が正確にSystem.Objectであることを指定する必要があります。これを行うには、変換を挿入します(暗黙のうちにC#が使用されます)。

_OrderByBody = Expression.Convert(_OrderByBody, typeof(object)); 
1

問題はExpression.Property(_OrderByParameter, _OrderByProperty.Name);がintを返す式を作成することです。箱に入れる必要があります。だからあなたはBox式でそれをラップする必要があります。あなたはそれが一般的なあなたがオブジェクトに

0

箱はならないようにしたい場合は、問題は、この行である:

_List = _List.OrderBy(_OrderByLambda); 

このメソッドは、Function<Item, int>パラメータ(Int32_Type.GetProperty("Value")返すために)期待するので、あなたが使用することはできませんExpression.Lambda<Func<Item, object>>タイプ。

あなたはobject一般的な機能が必要な場合は、これにあなたのクラス定義を変更する必要があります。

public class Item 
{ 
    public object Value { get; set; } 
    public string Name { get; set; } 
} 
関連する問題