フィールドを追加するには、式を再構築する必要があります。
これらの式が複雑ではなく、式が常にその形式であると仮定すると、basicUser
式を変更して新しいバインディングを追加することができます。あなたは単純な訪問者の助けを借りてそれを行うことができます。
public class AddDobBindingVisitor : ExpressionVisitor
{
private ParameterExpression parameter;
protected override Expression VisitLambda<T>(Expression<T> node)
{
parameter = node.Parameters.Single();
return base.VisitLambda(node);
}
protected override Expression VisitMemberInit(MemberInitExpression node)
{
var member = typeof(User).GetProperty("DOB");
var newBindings = new[]
{
Expression.Bind(member, Expression.Property(parameter, "DOB")),
};
var updatedNode = node.Update(
node.NewExpression,
node.Bindings.Concat(newBindings));
return base.VisitMemberInit(updatedNode);
}
}
次に、変更を適用します。
Expression<Func<Person, User>> basicUser = person => new User()
{
Name = person.FirstName
};
var detailedUser = (Expression<Func<Person, User>>)new AddDobBindingVisitor()
.Visit(basicUser);
// detailedUser:
// person => new User()
// {
// Name = person.FirstName,
// DOB = person.DOB
// }