這樣做的棘手部分是訪問匿名類型的類型,因此您可以撥打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);
你可以直接編寫你正在創建的lambda表達式,然後在調試器中查看它,看看它使用了什麼表達式,以便您知道您需要創建什麼,具體而言。 – Servy
按照這個 - https://stackoverflow.com/a/12705338/763026 –
@Servy我把它寫入泛型類,需要處理propertyName來改變 –