--- 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を覗いてみますと   ```csharp= .Lambda #Lambda1<System.Func`2[System.Object,System.Object]>(System.Object $target) { (System.Object)((ExpressionTree001.MyClass)$target).MyProperty } ``` この内容を参考にして、式木を作成していく。 ###### tags: `C#` `式木` `Expression`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up