【问题标题】:Debugging a C# Object Initializer调试 C# 对象初始化程序
【发布时间】:2010-10-27 01:51:54
【问题描述】:

是否有人对调试 C# 对象初始化程序块中的异常有任何提示?对象初始值设定项语法基本上是全有或全无,这使得在 LINQ 查询内部进行故障排除特别困难。除了将对象创建分解为一个单独的方法之外,我能做些什么来查看哪个属性设置器抛出异常吗?

【问题讨论】:

    标签: c# linq object initializer


    【解决方案1】:

    禁用跳过属性设置器的选项 [跳过属性和操作符(仅限托管)] 可以让您进入属性设置器。

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

    【讨论】:

    • 您能解释一下“将初始化参数包装成匿名类型”是什么意思吗?我会以某种方式将匿名类型传递给构造函数,还是只创建一个可以分配属性的实用程序工厂方法?
    • 现在,从它的声音来看,您正在使用查询结果来构造对象,并且您认为这会导致错误(在对象构造上)。相反,只需返回查询结果,然后在单独的步骤中构建您的对象(使用结果),这样您就可以避免对象初始化程序块。
    • 但是有可能以某种方式将匿名类型传递给构造函数吗?
    • 没有。您需要将匿名类型中的每个成员传递给构造函数,即: MyObj obj = new MyObj(anonInst.Param1); anonInst.Prop1 = anonInst.SomeProperty; ...等
    • 我认为@wcm 和我一直在纠结的是将匿名类型的 IEnumerable 传递给另一种方法进行组装。我突然意识到你的建议只是将 IEnumerable 放在一个单独的变量中并对其进行 foreach 。我已将此标记为最佳答案。
    【解决方案2】:

    您是否将 VS 设置为在抛出异常时中断? (默认情况下仅在未处理的异常上中断)。调试 |例外,并检查“抛出”。

    仅此一项可能无法回答您的问题,但它可能有助于调试。

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

    【讨论】:

      【解决方案3】:

      将其从您单独设置每个属性的对象初始化程序块中分离出来。这样你就可以真正进入代码。

      【讨论】:

        猜你喜欢
        • 2011-08-13
        • 2011-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-06
        • 1970-01-01
        相关资源
        最近更新 更多