using System;
using System.Linq;
using System.Linq.Expressions;
public class Test
{
public static void Main()
{
Expression<Func<float,float,float>> f1 = (x, y) => x + y;
Expression<Func<float,float>> f2 = x => x * x;
var pX = f2.Parameters[0];
var pY = f1.Parameters[1];
var replacerF2 = new ReplaceParameter(pX, pY);
var replacerF1 = new ReplaceParameter(pY, replacerF2.Visit(f2.Body));
var modifiedF1 = Expression.Lambda(
replacerF1.Visit(f1.Body)
, f1.Parameters
);
Console.WriteLine(modifiedF1);
}
class ReplaceParameter : ExpressionVisitor {
private readonly Expression replacement;
private readonly ParameterExpression parameter;
public ReplaceParameter(
ParameterExpression parameter
, Expression replacement
) {
this.replacement = replacement;
this.parameter = parameter;
}
protected override Expression VisitParameter(ParameterExpression node) {
return node == parameter ? replacement : node;
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkxpbnEuRXhwcmVzc2lvbnM7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CiAgICAgICAgRXhwcmVzc2lvbjxGdW5jPGZsb2F0LGZsb2F0LGZsb2F0Pj4gZjEgPSAoeCwgeSkgPT4geCArIHk7CiAgICAgICAgRXhwcmVzc2lvbjxGdW5jPGZsb2F0LGZsb2F0Pj4gZjIgPSB4ID0+IHggKiB4OwogICAgICAgIHZhciBwWCA9IGYyLlBhcmFtZXRlcnNbMF07CiAgICAgICAgdmFyIHBZID0gZjEuUGFyYW1ldGVyc1sxXTsKICAgICAgICB2YXIgcmVwbGFjZXJGMiA9IG5ldyBSZXBsYWNlUGFyYW1ldGVyKHBYLCBwWSk7CiAgICAgICAgdmFyIHJlcGxhY2VyRjEgPSBuZXcgUmVwbGFjZVBhcmFtZXRlcihwWSwgcmVwbGFjZXJGMi5WaXNpdChmMi5Cb2R5KSk7CiAgICAgICAgdmFyIG1vZGlmaWVkRjEgPSBFeHByZXNzaW9uLkxhbWJkYSgKICAgICAgICAJcmVwbGFjZXJGMS5WaXNpdChmMS5Cb2R5KQogICAgICAgICwgICBmMS5QYXJhbWV0ZXJzCiAgICAgICAgKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZShtb2RpZmllZEYxKTsKCX0KCQoJY2xhc3MgUmVwbGFjZVBhcmFtZXRlciA6IEV4cHJlc3Npb25WaXNpdG9yIHsKCQlwcml2YXRlIHJlYWRvbmx5IEV4cHJlc3Npb24gcmVwbGFjZW1lbnQ7CgkJcHJpdmF0ZSByZWFkb25seSBQYXJhbWV0ZXJFeHByZXNzaW9uIHBhcmFtZXRlcjsKCQlwdWJsaWMgUmVwbGFjZVBhcmFtZXRlcigKCQkgICAgUGFyYW1ldGVyRXhwcmVzc2lvbiBwYXJhbWV0ZXIKICAgIAksCUV4cHJlc3Npb24gcmVwbGFjZW1lbnQKCQkpIHsKCQkJdGhpcy5yZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50OwoJCQl0aGlzLnBhcmFtZXRlciA9IHBhcmFtZXRlcjsKCQl9CgkJcHJvdGVjdGVkIG92ZXJyaWRlIEV4cHJlc3Npb24gVmlzaXRQYXJhbWV0ZXIoUGFyYW1ldGVyRXhwcmVzc2lvbiBub2RlKSB7CgkJCXJldHVybiBub2RlID09IHBhcmFtZXRlciA/IHJlcGxhY2VtZW50IDogbm9kZTsKCQl9Cgl9Cn0=