10

デバッグモードで述語にカーソルを合わせると、いくつかの型名といくつかの理解できない記号が表示されます。これにより、コードのデバッグが非常に困難になります。たとえば、ある変数が保持している述語を知ることができます。私は通常、ラムダ式を使用してこの述語値を割り当てます。述語に何が含まれているのかを知る方法はありますか?

たとえば、1Predicate<object> myPredつまたは複数のList<Predicate<object>> predList変数がある場合、実行時にmyPredの値またはpredListに含まれる値をデバッグするにはどうすればよいですか?

4

3 に答える 3

5

あなたはおそらく欲しいですExpression<Predicate<T>>Predicate<T>呼び出すために変換できますが、ラムダ構造に関する情報は保持されます。

于 2011-06-09T15:43:46.817 に答える
2

[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
于 2011-06-09T18:33:45.140 に答える
-1

あなたがそのような例でそれを意味するなら

new List<int>()
.Select(i => i + 1);

i + 1の部分をデバッグしたい場合は、マウスカーソル(キャレット)をi + 1のどこかに置き、F9キーを押すと、その式にブレークポイントが追加されます。

于 2011-06-09T14:39:51.360 に答える