我使用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#反射走的任意对象的“成员树”,并通过具体的种类,他们有在运行时处理场没有为它甚至有可能的,而是由(碱/接口)类型变量的声明与?
作为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
类。