我用
ParameterExpression parameter = Expression.Parameter(typeof(T), "p");
var myexp=Expression.Lambda<Func<T, TKey>>(Expression.Property(parameter, "myid"), parameter);
像这样创建一个lambda表达式myexp
p=>myid
现在我想创建一个像这样的多属性
p=> new {myid,myid2}
答案 0 :(得分:2)
执行此操作的棘手部分是访问匿名类型的类型,以便您可以为其调用new
。我通常使用LINQPad创建一个示例lambda并将其转储以查看格式:
Expression<Func<Test,object>> lambdax = p => new { p.myid, p.myid2 };
lambdax.Dump();
假设p
的类型为Test
:
class Test {
public int myid;
public int myid2;
}
然后,您可以创建Expression
来重新创建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);