次のコードは正常に動作します(それが一般的なの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);