---
# System prepended metadata

title: C# 式木（Expression Tree）（C#の構文を動的に生成できる機能）2021-09-17
tags: [Expression, C#, 式木]

---

---
lang: ja-jp
breaks: true
---
# C# 式木（Expression Tree）（C#の構文を動的に生成できる機能）2021-09-17

> Expression クラス
> https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.expressions.expression

## Expression.Parameter

## Expression.Property

## Expression.Default

指定した型に設定された DefaultExpression プロパティを含む Type を作成します。

## Expression.Call

メソッドへの呼び出しを表す MethodCallExpression を作成します。

## Expression.Assign

代入演算を表す BinaryExpression を作成します。
BinaryExpression と等しい NodeType プロパティと、指定した値に設定された Assign プロパティおよび Left プロパティを含む Right が返却されます。

:::info
Assign式は値型の値をコピーし、参照型の参照をコピーします。
:::

## Expression.Field

## Expression.Block

式を含み、変数を含まない BlockExpression を作成します。

## Expression.Lambda

式本体をデリゲート型を構築し、ラムダの名前を構築し、パラメーター式の列挙可能なコレクションを構築することで LambdaExpression を作成します。

## Expression.Convert

型のキャスト

## Expression.PropertyOrField

## 式木の作り方

> Expression Treeのこね方・入門編 - 動的にデリゲートを生成してリフレクションを高速化
> http://neue.cc/2011/04/20_317.html
> https://neue.cc/2011/04/20_317.html

> 実際のコードで、具体的なラムダ式を書いてコンパイル通します。
```csharp=
// 適当なクラス
class MyClass
{
    public int MyProperty { get; set; }
}
 
static void Main(string[] args)
{
    // これで書くと(.NET 4以降の)代入やループはサポートされてないので、Funcでも全然いいです
    // ただ、デバッガで生成された式の結果が見えるので、Expressionでコンパイル通せたほうが楽かな
    Expression<Func<object, object>> expr =
        target => ((MyClass)target).MyProperty;
}
```
> 一旦デバッガでexprを覗いてみますと

![](https://i.imgur.com/pzD734E.png)

![](https://i.imgur.com/IcVjNWh.png)

```csharp=
.Lambda #Lambda1<System.Func`2[System.Object,System.Object]>(System.Object $target) {
    (System.Object)((ExpressionTree001.MyClass)$target).MyProperty
}
```

この内容を参考にして、式木を作成していく。


###### tags: `C#` `式木` `Expression`
