[C#IDEエクスペリエンスは確認していませんが、実際にはVS2010VB.NETエクスペリエンスを確認しています。]
Expression
@BenVoigtが示唆するように使用するか、述語に匿名ラムダを使用しないでください:(VB.NETの回答:名前を使用し、演算子Functions
で指定してください)。AddressOf
C#の答えは次のようなものです。自分で指定した明示的な関数を宣言し、述語を割り当てるときに関数名を指定します。
これは、述語を動的に作成する少なくとも1つの方法に正常に名前を付けることができることを確認する私のテストVB.NETコードです。VB.NET IDEでは、これらは名前で簡単に確認できます。
Module Module1
Sub Main()
For i = 1 To 2
'Dim p As Predicate(Of Object) = Function(o) (o Is Nothing)
'Dim p As Predicate(Of Object) = AddressOf NamedPredicate
Dim p As Predicate(Of Object) = GeneratePredicate(i)
Dim q As Expressions.Expression(Of Predicate(Of Object)) = Function(o) (o IsNot Nothing)
If p(q) Then Console.WriteLine((q.Compile)(p))
Next
End Sub
Private Function NamedPredicate(ByVal o As Object) As Boolean
Return (o Is Nothing)
End Function
Private Function GeneratePredicate(ByVal i As Integer) As Predicate(Of Object)
Dim gp = New Reflection.Emit.DynamicMethod("DynPred" & i, GetType(Boolean), {GetType(Object)})
Dim mb = gp.GetILGenerator
mb.Emit(Reflection.Emit.OpCodes.Ldarg, 0)
mb.Emit(Reflection.Emit.OpCodes.Ldnull)
mb.Emit(Reflection.Emit.OpCodes.Ceq)
If i = 2 Then
mb.Emit(Reflection.Emit.OpCodes.Ldc_I4_0)
mb.Emit(Reflection.Emit.OpCodes.Ceq)
End If
mb.Emit(Reflection.Emit.OpCodes.Ret)
GeneratePredicate = DirectCast(gp.CreateDelegate(GetType(Predicate(Of Object))), Predicate(Of Object))
End Function
End Module