调试C#对象初始化器

11

有没有人有关于在C#对象初始化块中调试异常的技巧?对象初始化语法基本上是全有或全无的,这使得在LINQ查询内部进行故障排除尤其困难。除了将对象创建拆分到单独的方法之外,我还能做些什么来查看哪个属性设置器抛出了异常吗?

3个回答

14

禁用“跳过属性设置器”选项[跳过属性和运算符(仅托管代码)],可以让你进入属性设置器的调试过程。

否则,通常最好的选择是在LINQ语句之外进行拆分并进行调试。您可以将初始化参数包装到Linq中的匿名类型中,并在Linq语句之外构造对象以进行调试目的。


你能解释一下“将初始化参数包装成匿名类型”是什么意思吗?我需要将匿名类型传递给构造函数吗,还是只需创建一个实用的工厂方法来分配属性即可? - technomalogical
现在听起来,您正在使用查询结果来构建对象,并且认为这会导致错误(在对象构造中)。相反,只需返回查询结果,然后在之后的单独步骤中构建您的对象(使用结果),以便避免对象初始化程序块。 - Reed Copsey
但是是否有可能以某种方式将匿名类型传递给构造函数? - wcm
不行。你需要将匿名类型的每个成员传递给构造函数,例如:MyObj obj = new MyObj(anonInst.Param1); anonInst.Prop1 = anonInst.SomeProperty; ...等等。 - Reed Copsey
我认为@wcm和我卡住的地方是将匿名类型的IEnumerable传递给另一个方法进行组装。我突然想到,你建议的只是将IEnumerable保存在单独的变量中,并对其进行foreach循环。我已将此标记为最佳答案。 - technomalogical
@technomalogical:是的,那正是我所建议的。如果没有表达清楚,我很抱歉。 - Reed Copsey

4

您是否已经设置了VS以在抛出异常时中断?(默认情况下仅在未处理的异常时中断)。调试|异常,并勾选“抛出”。

这可能并不是您问题的答案,但它可能有助于调试。

除此之外,您可以暂时将代码从初始化块中分离出来(仅供调试),然后如果需要,可以在代码正常工作后恢复初始化块。


1
将代码分解到对象初始化块外,这样你就可以逐步调试每个属性的设置了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接