動態建立 Lambda 表示式

2022-01-13 02:38:17 字數 3681 閱讀 1374

首先我們看乙個簡單 lambda 表示式的構成。

i => i > 5

在這個表示式中,"i" 被稱為 parameter,"i > 5" 是 body。我們可以對 body 進行更進一步的分解,那麼 "i > 5" 分別包含引數(i)、操作符(>)以及乙個常數(5)。所有這些通過特定順序的組合,從而構建乙個完整的 lambda 表示式。

我們通過一些例子,來學習如何動態構建這些表示式。

例子1

var ints = new

int ;

//var r = ints.where(i => i > 5);

//要實現的表示式

//建立引數 i

var parameter = expression.parameter(typeof(int), "i"

);//

建立常量5

var constant = expression.constant(5

);//

建立比較表示式 i > 5

var bin =expression.greaterthan(parameter, constant);

//獲取lambda表示式

var lambda = expression.lambdaint, bool>>(bin, parameter);

//通過 compile 方法獲取 delegate

var _r = ints.where(lambda.compile());

例子2

var ints = new

int ;

//var r = ints.where(i => i > 5 && i <= 7);

//要實現的表示式

//建立引數 i

var parameter = expression.parameter(typeof(int), "i"

);//

建立表示式 i > 5

var con1 = expression.constant(5

);var bin1 =expression.greaterthan(parameter, con1);

//建立表示式 i <= 7

var con2 = expression.constant(7

);var bin2 =expression.lessthanorequal(parameter, con2);

//組合兩個表示式

var body =expression.and(bin1, bin2);

//獲取 lambda 表示式

var lambda = expression.lambdaint, bool>>(body, parameter);

var _r = ints.where(lambda.compile());

在例子2中,我們對複雜的表示式進行了分解,並使用 and 完成多個表示式的組裝,由此我們可以建立更加複雜的邏輯組合,比如例子3。

例子3

var ints = new

int ;

//var r = ints.where(i => (i > 5 && i <= 7) || (i == 3));

//要實現的表示式

//建立引數 i

var parameter = expression.parameter(typeof(int), "i"

);//

建立表示式 i > 5

var con1 = expression.constant(5

);var bin1 =expression.greaterthan(parameter, con1);

//建立表示式 i < 7

var con2 = expression.constant(7

);var bin2 =expression.lessthanorequal(parameter, con2);

//建立表示式 i == 3

var con3 = expression.constant(3

);var bin3 =expression.equal(parameter, con3);

//組合 i > 5 && i <= 7

var body =expression.and(bin1, bin2);

//組合 ( i > 5 && i <= 7) or (i == 3)

body =expression.or(body, bin3);

var lambda = expression.lambdaint, bool>>(body, parameter);

var _r = ints.where(lambda.compile());

例子4

var ints = new

int ;

//var r = ints.select(i => i % 2 == 0 ? i : 0);

//要實現的表示式

//建立引數 i

var parameter = expression.parameter(typeof(int), "i"

);//

建立表示式 i % 2

var con1 = expression.constant(2

);var bin1 =expression.modulo(parameter, con1);

//建立表示式 (i % 2) == 0

var con2 = expression.constant(0

);var bin2 =expression.equal(bin1, con2);

//建立表示式 iif(((i % 2) = 0), i, 0)

var bin3 = expression.condition(bin2, parameter, expression.constant(0

));var lambda = expression.lambdaint, int>>(bin3, parameter);

var _r = ints.select(lambda.compile());

例子5

var ints = new

int ;

i => console.writeline(i));

//要實現的表示式

//建立引數i

var parameter = expression.parameter(typeof(int), "i"

);//

獲取 console.writeline methodinfo

methodinfo method = typeof(console).getmethod("

writeline

", new type );

//建立表示式

var call =expression.call(method, parameter);

var lambda = expression.lambdaint>>(call, parameter);

array.foreach

(ints, lambda.compile());

動態建立 Lambda 表示式

作為 delegate 的更深度進化,lambda 讓我們的 顯得更加簡潔和優雅,但同時也面臨乙個問題,就是如何依據外部條件動態構建乙個 lambda 表示式。或許你會奇怪這個需求是如何產生的 首先,lambda 在 dlinq 中承擔了以往 t sql 的部分角色 其次,在資料庫設計中,我們往往需...

lambda表示式 lambda表示式

1.概述 c 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或 exception 宣告 返回值型別可以看到,lambda 主要分為五個部分 函式物件引數 操作符過載函式引數 muta...

Lambda表示式和Lambda表示式樹

原版來自 linq學習筆記之二 lambda表示式和lambda表示式樹 lambda 表示式 lambda expressions 是linq實現的另一特性。lambda表示式的作用就是使用使用函式式語法,將方法實現關聯到委託例項。在使用查詢表示式 query expressions 時,查詢表示...