Lou*_*hys 9 c# debugging lambda visual-studio predicates
在调试模式下,如果我将鼠标悬停在谓词上,我看到的只是一些类型名称和一些不可理解的符号.这使得调试代码变得非常困难,例如知道某个变量所持有的谓词.我通常使用lambda表达式分配这个谓词值.有没有办法知道谓词包含什么?
例如,如果我有Predicate<object> myPred变量或List<Predicate<object>> predList变量,我如何调试myPred的值或者运行时包含的predList?
[我没有检查C# IDE体验,但实际上是VS2010 VB.NET体验。]
要么按照 @BenVoigt 的建议使用Expression,要么不要对谓词使用匿名 lambda:(VB.NET 答案:使用Functions由您命名并使用运算符指定它们AddressOf。)
C# 答案类似于:声明由您命名的显式函数,并在分配谓词时指定函数名称。
下面是我的测试 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1349 次 |
| 最近记录: |