2014-09-30 51 views
0

我想做一個幫助器方法,使用表達式樹創建一個動態選擇器。創建類型二進制表達式編程

目標是將此選擇器轉換爲表達式樹。

var list = new User[0].AsQueryable(); 
var q = list.Select(u => new { User = u, Address = "Address X", Fax = "Fax Y" }); 

表達式樹可視化工具就說明是這樣的:

Visualizer

這裏是我到目前爲止已經試過:

var userParam = Expression.Parameter(typeof(User), "u"); 
var obj = new { User = new User(), Address = string.Empty, Fax = string.Empty }; 
var q = list.Select(DynamicSelect(obj, userParam)); 

static Expression<Func<User, T>> DynamicSelect<T>(T obj, ParameterExpression userParam) 
{ 
    var user = Expression.Lambda<Func<User, User>>(/* ?? stuck here */, userParam); 
    var newExpression = Expression.New(
     typeof(T).GetConstructor(new []{typeof(User), typeof(string), typeof(string)}), 
     user, 
     Expression.Constant("Address X"), 
     Expression.Constant("Fax Y"), 
    ); 

    return Expression.Lambda<Func<User, T>>(newExpression, userParam); 
} 
+0

你的代碼似乎試圖創建類似於'u => new {User = u =>/*卡在這裏* /,Address =「Address X」,Fax =「Fax Y」}''。你爲什麼這樣做?你爲什麼試圖在lambda中使用lambda,這對我沒有任何意義。 – svick 2014-09-30 10:51:03

回答

1

你不需要內部拉姆達此處爲拉姆達,您可以直接使用userParam

static Expression<Func<User, T>> DynamicSelect<T>(T obj, ParameterExpression userParam) 
{ 
    var newExpression = Expression.New(
     typeof(T).GetConstructor(new []{typeof(User), typeof(string), typeof(string)}), 
     userParam, 
     Expression.Constant("Address X"), 
     Expression.Constant("Fax Y"), 
    ); 

    return Expression.Lambda<Func<User, T>>(newExpression, userParam); 
} 

另外,我不明白爲什麼userParam是該方法的一個參數,我會在該方法內創建它。

+0

Omg,我從來沒有想過傳遞參數將工作,我接受參數作爲參數,以防止像[在我以前的問題](http://stackoverflow.com/questions/25842275/combining-andalso-the-parameter- FOO此結果未結合的功能於該指定的-LINQ到ENT) – tsuta 2014-09-30 10:58:08