排除转储 OnDemand / DumpContainer 时忽略的参数

Exclude argument ignored when Dump'ing an OnDemand / DumpContainer

编辑 - 这已从 v6.11.11 开始修复!

我试图根据标志 属性 使用 Util.OnDemand 以两种不同的方式转储结果集,但发现它没有按预期工作。我能够用这个小例子重现它:

    void Main()
    {
        var i = new Test() { Prop1 = "One" };
        i.Dump(exclude:"Prop1");
        Util.OnDemand("On Demand Exclude Prop1", ()=>i).Dump(exclude:"Prop1");
    }
    
    public class Test
    {
        public string Prop1 { get; set; }
    }

输出:

    Test
    UserQuery+Test

    On Demand Exclude Prop1

点击后 Util.OnDemand link:

    Test
    UserQuery+Test

    Test
    UserQuery+Test
    Prop1 One

预期结果:

    Test
    UserQuery+Test

    Test
    UserQuery+Test

我相当确定这与 Util.OnDemand 没有直接关系,但更可能是 DumpContainer 的问题,因为这也会产生相同的非排除结果:

    new DumpContainer(i).Dump(exclude:"Prop1");

我这里有什么地方做错了吗?任何潜在的解决方法?

我没有检查每个参数,但我已经确认 collapseTo 在以这种方式调用时也有问题,可能其他人也有问题。

我不相信这是可能的。我的理解是 Dump(exclude:"") 从调用该方法的对象中排除 属性。在你的情况下,你 运行 它在没有 Prop1 属性 的 LINQPad.DumpContainer 对象上。我无法从 DumpContainer.Content.

中排除 Prop1

干净且推荐的解决方案是覆盖 ToDump 方法:


public class Test
{
    public string Prop1 { get; set; }

object ToDump()
{
   IDictionary<string,object> custom = new System.Dynamic.ExpandoObject();

   var props = GetType().GetProperties (BindingFlags.Public | BindingFlags.Instance)
       .Where (p => p.Name != "Prop1");

   foreach (var prop in props)
      custom[prop.Name] = prop.GetValue (this);
      
   return custom;
}
}

另一种方式,如果您不想编写额外的方法,可以先将其转换为 ExpandoObject,这将导致难看的一个衬里:

Util.OnDemand("On Demand Exclude Prop1", () => (Util.ToExpando(i, exclude:"Prop1"))).Dump()

这不是理想的行为:includeexclude 等选项应该对转储容器的内容进行操作,而不是容器本身。我将修复下一个 LINQPad 版本。与此同时,建议的解决方法看起来不错。