如何在C#/Visual Studio中调试谓词?

如何在C#/Visual Studio中调试谓词?,c#,visual-studio,debugging,lambda,predicates,C#,Visual Studio,Debugging,Lambda,Predicates,在调试模式下,如果我将鼠标悬停在谓词上,我看到的只是一些类型名和一些不可理解的符号。这使得调试代码非常困难,例如,要知道某个变量包含的谓词是什么。我通常使用lambda表达式为这个谓词赋值。有没有办法知道谓词包含什么 例如,如果我有一个谓词myPred变量或列表predList变量,我如何在运行时调试myPred的值或predList包含的内容?如果在这样的示例中是这样的话 new List<int>() .Select(i => i + 1); 新列表() .选择(i=>i

在调试模式下,如果我将鼠标悬停在谓词上,我看到的只是一些类型名和一些不可理解的符号。这使得调试代码非常困难,例如,要知道某个变量包含的谓词是什么。我通常使用lambda表达式为这个谓词赋值。有没有办法知道谓词包含什么


例如,如果我有一个
谓词myPred
变量或
列表predList
变量,我如何在运行时调试myPred的值或predList包含的内容?

如果在这样的示例中是这样的话

new List<int>()
.Select(i => i + 1);
新列表()
.选择(i=>i+1);

您想调试i+1部分,然后可以将鼠标光标(插入符号)放在i+1的某个位置,然后按F9键,这将在该表达式中添加断点

您可能需要的
表达式
。它可以转换为
谓词
,以便调用它,但保留了有关lambda结构的信息。

[我没有检查C#IDE体验,但实际上是VS2010 VB.NET体验。]

按照@BenVoigt的建议使用
表达式
,或者不要对谓词使用匿名lambda:(VB.NET回答:使用您命名的
函数
,并使用
AddressOf
操作符指定它们。)

C#答案类似于:声明由您命名的显式函数,并在分配谓词时指定函数名

下面是我的测试VB.NET代码,它确认至少有一种动态创建谓词的方法可以成功命名。在VB.NET IDE中,可以通过名称很容易地看到这些

模块1
副标题()
对于i=1到2
'Dim p As Predicate(Of Object)=函数(o)(o为零)
'Dim p As Predicate(Of Object)=NamedPredicate的地址
Dim p作为谓词(对象的)=GeneratePredicate(i)
Dim q作为表达式。表达式(谓词(对象)的))=函数(o)(o不是零)
如果是p(q),那么Console.WriteLine((q.Compile)(p))
下一个
端接头
将私有函数命名为Boolean的predicate(对象为ByVal o)
返回(o为零)
端函数
私有函数GeneratePredicate(ByVal i作为整数)作为谓词(对象的)
Dim gp=New Reflection.Emit.DynamicMethod(“DynPred”&i,GetType(Boolean),{GetType(Object)})
Dim mb=gp.GetILGenerator
mb.Emit(Reflection.Emit.OpCodes.Ldarg,0)
Emit(Reflection.Emit.opcode.Ldnull)
Emit(Reflection.Emit.opcode.Ceq)
如果i=2,那么
Emit(Reflection.Emit.opcode.Ldc_I4_0)
Emit(Reflection.Emit.opcode.Ceq)
如果结束
Emit(Reflection.Emit.opcode.Ret)
GeneratePredicate=DirectCast(gp.CreateDelegate(GetType)(谓词(对象))),谓词(对象))
端函数
端模块

或者,您可以编写单元测试来验证代码的行为。如果您在对我的答案的评论中提供了额外的信息,我相信您需要扩展此问题或提出一个新问题,以了解生成“可调试”lambda表达式的方法。我想这个问题的答案是生成命名函数,在VB.NET中,这些函数是易于调试的。不,我不是这个意思。我编辑了我的问题以添加澄清。我的程序以编程方式创建了很多函数,所以我认为这是不可能的。我如何将它与lambda表达式一起使用,以及调试中将显示什么?@Louis:我添加了一个示例,如果您还有其他问题,请告诉我。这就是为什么您不应该将代码放在您的答案之外-链接已断开…代码不是我的答案,只是为了进一步了解。所有重要的关键词和方法都在这里。