2017-08-07 30 views
1

我用我怎樣才能讓一個多屬性的lambda表達式使用LINQ

ParameterExpression parameter = Expression.Parameter(typeof(T), "p"); 

var myexp=Expression.Lambda<Func<T, TKey>>(Expression.Property(parameter, "myid"), parameter); 

創建一個lambda表達式myexp喜歡這個

p=>myid 

現在我想建立一個MULT屬性這樣

p=> new {myid,myid2} 
+4

你可以直接編寫你正在創建的lambda表達式,然後在調試器中查看它,看看它使用了什麼表達式,以便您知道您需要創建什麼,具體而言。 – Servy

+0

按照這個 - https://stackoverflow.com/a/12705338/763026 –

+0

@Servy我把它寫入泛型類,需要處理propertyName來改變 –

回答

1

這樣做的棘手部分是訪問匿名類型的類型,因此您可以撥打new它。我通常使用LINQPad創建樣品的λ和轉儲它來查看格式:

Expression<Func<Test,object>> lambdax = p => new { p.myid, p.myid2 }; 
lambdax.Dump(); 

假設p類型是Test

class Test { 
    public int myid; 
    public int myid2; 
} 

然後您可以創建Expression s到重建lambdax值:

var exampleTest = new Test(); 
var example = new { exampleTest.myid, exampleTest.myid2 }; 
var exampleType = example.GetType(); 

var rci = exampleType.GetConstructors()[0]; 
var parm = Expression.Parameter(typeof(Test), "p"); 
var args = new[] { Expression.PropertyOrField(parm, "myid"), Expression.PropertyOrField(parm, "myid2") }; 

var body = Expression.New(rci, args, exampleType.GetMembers().Where(m => m.MemberType == MemberTypes.Property)); 
var lambda = Expression.Lambda(body, parm); 
+0

我嘗試了LINQPad並且很喜歡它,非常感謝幫助^ ^,現在我使用對象類型來傳遞匿名類型來做我想要的! –

相關問題