配置StatePrinter只跟随声明类型?(Configure StatePrinter to o

2019-10-22 17:22发布

我使用Stateprinter打印/比较我的类型。 它的工作原理相当不错,但是,它会比较实际类型各(分)的对象,而不是声明类型的子对象。

一个例子:

class X {
  string Foo;
  int Bar;
}

interface IMyData {
  public X MyConfig { get; }
}

现在,当调用:

var cfg = ConfigurationHelper.GetStandardConfiguration();
cfg.Add(new PublicFieldsAndPropertiesHarvester());
var printer = new Stateprinter(cfg);

// ...

IMyData v = new MyDataWithMoreStuff();

printer.PrintObject(v);

这将打印所有的公共字段和属性MyDataWithMoreStuff而不仅仅是公共状态,通过可视IMyData

有没有办法用Stateprinter做到这一点,或者如果当前没有实现,使用C#反射走的任意对象的“成员树”,并通过具体的种类,他们有在运行时处理场没有为它甚至有可能的,而是由(碱/接口)类型变量的声明与?

Answer 1:

作为v2.1.xx的你现在可以指定基于其他类型的类型的投影。 IE浏览器。 请执行下列操作

    [Test]
    public void TestIncludeByType()
    {
        var sut = new AtoD();
        Asserter assert;

        assert = TestHelper.CreateShortAsserter();
        assert.PrintEquals("new AtoD() { A = 1 B = 2 C = 3 D = 4 }", sut);

        assert = TestHelper.CreateShortAsserter();
        assert.Project.IncludeByType<AtoD, IA>();
        assert.PrintEquals("new AtoD() { A = 1 }", sut);

        assert = TestHelper.CreateShortAsserter();
        assert.Project.IncludeByType<AtoD, IA, IB>();
        assert.PrintEquals("new AtoD() { A = 1 B = 2 }", sut);

        assert = TestHelper.CreateShortAsserter();
        assert.Project.IncludeByType<AtoD, IA, IB, IC>();
        assert.PrintEquals("new AtoD() { A = 1 B = 2 C = 3 }", sut);

        assert = TestHelper.CreateShortAsserter();
        assert.Project.IncludeByType<AtoD, IA, IB, IC, ID>();
        assert.PrintEquals("new AtoD() { A = 1 B = 2 C = 3 D = 4 }", sut);
    }

    [Test]
    public void TestExcludeByType()
    {
        var sut = new AtoD();
        Asserter assert;

        assert = TestHelper.CreateShortAsserter();
        assert.PrintEquals("new AtoD() { A = 1 B = 2 C = 3 D = 4 }", sut);

        assert = TestHelper.CreateShortAsserter();
        assert.Project.ExcludeByType<AtoD, IA>();
        assert.PrintEquals("new AtoD() { B = 2 C = 3 D = 4 }", sut);

        assert = TestHelper.CreateShortAsserter();
        assert.Project.ExcludeByType<AtoD, IA, IB>();
        assert.PrintEquals("new AtoD() { C = 3 D = 4 }", sut);

        assert = TestHelper.CreateShortAsserter();
        assert.Project.ExcludeByType<AtoD, IA, IB, IC>();
        assert.PrintEquals("new AtoD() { D = 4 }", sut);

        assert = TestHelper.CreateShortAsserter();
        assert.Project.ExcludeByType<AtoD, IA, IB, IC, ID>();
        assert.PrintEquals("new AtoD() { }", sut);
    }

但是这是基于类型的,基于参考类型的状态不是一般收获滤波。 也就是说,我不认为这是可能的代码是现在的方式:

 class IntroSpector  
 {
    void Introspect(object source, Field field)
    {
        if (IntrospectNullValue(source, field))
            return;

        var sourceType = source.GetType();

        ...

所以StatePrinter询问的基础类型( GetType() 你可能需要重载方法也许更好,代码ReferenceAwareIntrospector这需要第三个参数,参考参数,并与工作。

它应该是很容易做到这一点,使得内省配置同样是一个容易扩展Configuration类。



文章来源: Configure StatePrinter to only follow the declared types?