解析Expression 表示式

2022-06-26 11:54:10 字數 2419 閱讀 5675

前言

時光荏苒,2023年不覺中已成過去。2021剛剛開頭,新的開始本應意氣風發、本應有會當凌絕頂豪情壯志,再不濟也該「鴻圖霸業談笑間」,且不管一入江湖是不是歲月摧的灑脫。很不幸,有些事情就是會突入其來,搞得你觸不及防,什麼心情都沒有。但是我居然還是寫下了這篇部落格。。。。。。嗯,總算是有地方表達以我糟糕心情了。

本來是想解決一下合併兩個expression>型別的表示式的問題,比如:

expression> exp1 = t => t.updatetime; expression> exp2 = t => new ;

合併為乙個表示式:expression> exp1 = t => new ;

之前嘗試過一些辦法(比如下圖方法1和方法2,但是都失敗了)也請教過一些大佬,都沒有解決這個問題。於是我只能繞過這個問題用其他方法去實現了業務需求(在這裡丟擲這個問題,也希望能有人幫我解惑)

退而求其次

我通過解析出來表示式中指定的屬性也能滿足我的需求,下面是我的實現方式:

1

private

static listselectmembers(expression properties)2;

9return

newarrmembers;10}

11else

1218

else

1928

return

null;29

}30}31 }

如何使用

1

public

override task updateasync(t model, expressionobject>>properties)

210 model.updatedtime =datetime.now;

11return

base

.updateasync(model, properties);

12 }

下面附上一些實用的擴充套件

1

using

system;

2using

system.collections.generic;

3using

system.dynamic;

4using

system.linq;

5using

system.linq.expressions;

6using

system.reflection;78

namespace

syspetro.core.extensions935

///36

///合併表示式 expr1 or expr2

37///

38///

39///

40///

41///

42public

static expressionbool>> or(this expressionbool>> expr1, expressionbool>>expr2)

4356

///57

///取反表示式

58///

59///

60///

61///

62public

static expressionbool>> not(this expressionbool>>expr)

6370

///71

///獲取表示式屬性列表

72///

73///

74///

75///

76public

static listselectmembers(this expressionobject>>expr)

7780

private

static listselectmembers(expression properties)81;

88return

newarrmembers;89}

90else

9197

else

98107

return

null

;108

}109

}110

}111

}112 }

總結縱然此時你的內心是千瘡百孔,萬般無奈,那又怎樣,你還想繼續生活嗎?那就只能繼續前向,繼續拼搏,努力讓自己更加強大。所以該做的事情還是要做,加油。

LINQ 表示式樹 Expression

在 linq to objects 中,擴充套件方法需要將乙個委託型別作為引數,這樣就可以將 表示式賦予引數。達式也可以賦予expression型別的引數。expression型別指定,來自於 表示式的表示式樹儲存在程式集中。這樣,就可以在執行期間分析表示式,並進行優化,以便於查詢資料來源。下面看看...

LINQ 表示式樹 Expression

在 linq to objects 中,擴充套件方法需要將乙個委託型別作為引數,這樣就可以將 表示式賦予引數。達式也可以賦予expression型別的引數。expression型別指定,來自於 表示式的表示式樹儲存在程式集中。這樣,就可以在執行期間分析表示式,並進行優化,以便於查詢資料來源。下面看看...

EXpression 表示式目錄樹

表示式樹 前面n 1的是乙個表示式 最後乙個是乙個表示式 一直拆開拆到最後 繼承expressionvisitor的類 可以重寫獲取到表示式樹的方法進行擴張和改寫 委託是編譯成乙個方法 表示式樹不是的 是一種資料結構 但是通過exp.compile 方法編譯後就是乙個委託 能進行compile 的只...