排除转储 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()
这不是理想的行为:include
和 exclude
等选项应该对转储容器的内容进行操作,而不是容器本身。我将修复下一个 LINQPad 版本。与此同时,建议的解决方法看起来不错。
编辑 - 这已从 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()
这不是理想的行为:include
和 exclude
等选项应该对转储容器的内容进行操作,而不是容器本身。我将修复下一个 LINQPad 版本。与此同时,建议的解决方法看起来不错。