.NET 表达式 - 属性 初始化器

.NET Expressions - Property Initializers

我试图找到一个示例,说明如何使用 .NET 表达式库来新建对象并使用 属性 初始值设定项分配属性。有人有这方面的例子吗?

基本上,我需要的表达式代码相当于:

new Foo() { Bar = "bar", Baz = 5 }

到目前为止我有 Expression.New(constructorInfo),但我不确定如何添加 属性 初始值设定项。

最直接的方法就是新建对象,然后分配它的每个属性。由于这涉及多个语句,因此您需要使用一个块。块中的最后一个表达式是它的 return 值。

var fooVariable = Expression.Variable(typeof(Foo));
var block = Expression.Block(new[] { fooVariable },
    Expression.Assign(fooVariable, Expression.New(typeof(Foo))),
    Expression.Assign(Expression.Property(fooVariable, "Bar"), Expression.Constant("bar")),
    Expression.Assign(Expression.Property(fooVariable, "Baz"), Expression.Constant(5)),
    fooVariable);

See it on dotnetfiddle.net.

也可以使用Expression.MemberInit,更准确的表示对象初始化器:

var foo = Expression.MemberInit(
    Expression.New(typeof(Foo)),
    Expression.Bind(typeof(Foo).GetProperty("Bar"), Expression.Constant("bar")),
    Expression.Bind(typeof(Foo).GetProperty("Baz"), Expression.Constant(5)))

See it on dotnetfiddle.net.