• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
works guo

成功的渴望与生俱来---- 成功是获得赞美与尊重的最有效的途径
博客园    首页    新随笔    联系   管理    订阅  订阅

Creating An Expression from Another Expression

Expression Trees它的API核心是继承一个抽象基类叫Expression.
Expression Trees
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));
    }


我们开始用一个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);
    }


注意在上面的代码中,我明确的指定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);
            }
        };
    }



posted @ 2008-03-29 12:31  works guo  阅读(321)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3