Creating An Expression from Another Expression
Expression Trees
Expression Trees它的API核心是继承一个抽象基类叫Expression.
从其他的Expression中创建一个Expression
你能取一个表达式树和修改它,并用它创建另一个表达式.在下面的事例中,我们将开始使用一个x*x的lambda expression并且修改这个表达式,给它添加2.让我们看看吧:
我们开始用一个lambda exprrssion返回一个 square;
Expression<Func<int, int>> square = x => x * x;
下一个我们使用第一个lambda expression的body产生一个新的lambda expression并且添加一个常量2并且分配到binary expression.
最后,我们结合新的body和参数产生新的lambda expression.重要点注意的是引用第一个 lambda expression 的参数时候要和第一个 lambda expression 参数一样,为
square.Parameters.你不能在运行时创建一个新的parameters collection.
还有一个约束就是当你使用一个lambda expression的参数时,这个参数有ref,out关键字时,你必须明确的指定参数类型,因为编译器不能推测类型.
注意在上面的代码中,我明确的指定int类型的参数,如果你省略拉参数类型,编译器将会抱错误.
另一方面限制我们在参数类型为一个lambda expression访问lamdbas时不管理是否或没有指定参数类型不能使用paramss关键字.下面代码不编译因为这个参数定义是params关键字.
Expression Trees它的API核心是继承一个抽象基类叫Expression.
从其他的Expression中创建一个Expression
你能取一个表达式树和修改它,并用它创建另一个表达式.在下面的事例中,我们将开始使用一个x*x的lambda expression并且修改这个表达式,给它添加2.让我们看看吧:
public static void CreatingAnExpressionFromAnotherExpression()
{
Expression<Func<int, int>> square = x => x * x;
BinaryExpression squareplus2 = Expression.Add(square.Body,
Expression.Constant(2));
Expression<Func<int, int>> expr = Expression.Lambda<Func<int, int>>(squareplus2,
square.Parameters);
Func<int, int> compile = expr.Compile();
Console.WriteLine(compile(10));
}
{
Expression<Func<int, int>> square = x => x * x;
BinaryExpression squareplus2 = Expression.Add(square.Body,
Expression.Constant(2));
Expression<Func<int, int>> expr = Expression.Lambda<Func<int, int>>(squareplus2,
square.Parameters);
Func<int, int> compile = expr.Compile();
Console.WriteLine(compile(10));
}
我们开始用一个lambda exprrssion返回一个 square;
Expression<Func<int, int>> square = x => x * x;
下一个我们使用第一个lambda expression的body产生一个新的lambda expression并且添加一个常量2并且分配到binary expression.
BinaryExpression squareplus2 = Expression.Add(square.Body, Expression.Constant(2));
最后,我们结合新的body和参数产生新的lambda expression.重要点注意的是引用第一个 lambda expression 的参数时候要和第一个 lambda expression 参数一样,为
square.Parameters.你不能在运行时创建一个新的parameters collection.
还有一个约束就是当你使用一个lambda expression的参数时,这个参数有ref,out关键字时,你必须明确的指定参数类型,因为编译器不能推测类型.
delegate void OutParameter(out int i);
delegate void RefParameter(ref int i);
public static void GotchasWithLambdas()
{
//example with out parameter int i;
OutParameter something = (out int x) => x = 5;
something(out i);
Console.WriteLine(i);
//example with ref parameter.
int a = 2;
RefParameter test = (ref int x) => x++;
test(ref a);
Console.WriteLine(a);
}
delegate void RefParameter(ref int i);
public static void GotchasWithLambdas()
{
//example with out parameter int i;
OutParameter something = (out int x) => x = 5;
something(out i);
Console.WriteLine(i);
//example with ref parameter.
int a = 2;
RefParameter test = (ref int x) => x++;
test(ref a);
Console.WriteLine(a);
}
注意在上面的代码中,我明确的指定int类型的参数,如果你省略拉参数类型,编译器将会抱错误.
另一方面限制我们在参数类型为一个lambda expression访问lamdbas时不管理是否或没有指定参数类型不能使用paramss关键字.下面代码不编译因为这个参数定义是params关键字.
delegate void ParmsParameter(params int[] ints);
public static void LambdaWithParam()
{
ParmsParameter par = (params int[] ints) =>
{
foreach (int i in ints)
{
Console.WriteLine(i);
}
};
}
public static void LambdaWithParam()
{
ParmsParameter par = (params int[] ints) =>
{
foreach (int i in ints)
{
Console.WriteLine(i);
}
};
}