using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.UI.WebControls;
using dynamic = System.Linq.Dynamic;
using System.Linq.Expressions;
namespace Project.Lib.Extensions
{
public static partial class Utils
{
public static List<T> SortForMe<T>(this List<T> list, string propertyName,SortDirection sortDirection)
{
string exp1 = string.Format("model.{0}", propertyName);
var p1 = Expression.Parameter(typeof(T), "model");
var e1 = dynamic.DynamicExpression.ParseLambda(new[] { p1 }, null, exp1);
if (e1 != null)
{
if (sortDirection==SortDirection.Ascending)
{
var result = list.OrderBy((Func<T, object>)e1.Compile()).ToList();
return result;
}
else
{
var result = list.OrderByDescending((Func<T, object>)e1.Compile()).ToList();
return result;
}
}
return list;
}
}
}
我正在使用此代碼按propertyName排序我的通用列表。當屬性類型爲string
,這段代碼成功運行,但是當類型爲long
或int
,我得到這個異常:無法使用Int64投射System.Func`2類型的對象
無法轉換 類型的對象System.Func`2 [Project.Lib .Model.UserQueryCount,System.Int64]'鍵入 'System.Func`2 [Project.Lib.Model.UserQueryCount,System.Object]'。
var result = list.OrderBy((Func<T, dyamic>)e1.Compile()).ToList();
在上面的線,我決定用dynamic
,但同樣得到了異常。我該怎麼辦?
我改變了我的方法是這樣的:
public static List<TModel> SortForMe<TModel>(this List<TModel> list, string propertyName,SortDirection sortDirection) where TModel:class
{
var ins = Activator.CreateInstance<TModel>();
var prop= ins.GetType().GetProperty(propertyName);
var propertyType = prop.PropertyType;
string exp1 = string.Format("model.{0}", propertyName);
var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TModel), "model");
var e1 = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p1 }, null, exp1);
if (e1 != null)
{
if (sortDirection==SortDirection.Ascending)
{
return list.OrderBy((Func<TModel, propertyType>)e1.Compile()).ToList();
}
return list.OrderByDescending((Func<TModel, propertyType>)e1.Compile()).ToList();
}
return list;
}
我使用屬性類型反映,在函數功能我不能這樣使用它了:"Func<TModel, propertyType>"
有什麼辦法來解決這個問題
感謝您的幫助。
沒有時間去錯誤狩獵,但你應該能夠從這裏竊取大部分lambda代碼:http://stackoverflow.com/questions/41244/dynamic-linq-orderby - 非常類似的問題 – 2012-08-03 12:59:23
也',使用動態= System.Linq。動態;'真的很混亂; 'dynamic'是上下文關鍵字;強烈建議你選擇另一個別名...或者根本不要使用別名 – 2012-08-03 13:01:47
「using dynamic = System.Linq.Dynamic;」我刪除了這個。我改變了「var e1 = System.Linq.Dynamic.DynamicExpression.ParseLambda(new [] {p1},null,exp1);」感謝您的建議 – 2012-08-03 13:14:54