次の形式の関数呼び出しが表示された場合:
Dim i as Integer = getAnInteger("I am groot")
の署名はgetAnInteger
次のようなものでなければならないことがわかります
Function getAnInteger(inp As String) As Integer
今、私はこの電話をかけています:
Property Name As String
Get
Return _name
End Get
Set(ByVal value as String)
_name = value
doSomething(Function() Name) '<---- this one
End Set
End Property
私doSomething
はそれが次のように定義されているに違いないと考えました
Sub doSomething(ByVal fnName As Func(Of String))
'
' or
'
Sub doSomething(Of T)(ByVal fnName As Func(Of T)) '....................(1)
私はそれが
Sub doSomething(Of T)(ByVal fnName As Expression(Of Func(Of T))) '.....(2)
両方を来るどのようにFunc(Of T)
してExpression(Of Func(Of T))
引数受け入れることができ、String型のプロパティです。また、中にある名前空間。したがって、引数はlinq式である必要があります。しかし、Linqではありません!それは財産への明白な委任です。では、これはどのように機能していますか?Function() Name
Name
Expression
Linq
Function() Name
Name
Expression(Of T)
はコンパイラが知っている特別な型であり、そこに魔法があります。
ラムダ式(前述のようなFunction() Name
)をデリゲート型(例Func(Of String)
)に割り当てると、コンパイラーは実行可能コードを生成しますが、同じラムダ式を割り当てると、コードを表すツリー構造でExpression(Of Func(Of String))
ある式ツリーが生成されます。
これは主にクエリプロバイダーに役立ちます。たとえば、Entity Frameworkはこれを使用して、データベースに対して実行できる適切なSQLコードを生成します。
あなたは、変換することができますExpression(Of Func(Of String))
にFunc(Of String)
呼び出すことにより、実行時にCompile
メソッドを。変換Func(Of String)
には、Expression(Of Func(String))
私の知る限り、可能ではないまで、です。Expression
クラスメソッドを使用して手動でツリーを作成できますが、デリゲートを渡すだけで自動的にツリーを作成することはできません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加