static Filters BuildFilters()
    {
        var filters = new Filters();

        filters.Add <FilterParentEntity>((context, item) => item.Property != "Ignore");
        filters.Add <FilterChildEntity>((context, item) => item.Property != "Ignore");
        return(filters);
    }
    public async Task Simple()
    {
        var filters = new Filters();

        filters.Add <Target>((o, target) => target.Property != "Ignore");
        Assert.True(await filters.ShouldInclude(new object(), new Target()));
        Assert.False(await filters.ShouldInclude <object>(new object(), null));
        Assert.True(await filters.ShouldInclude(new object(), new Target {
            Property = "Include"
        }));
        Assert.False(await filters.ShouldInclude(new object(), new Target {
            Property = "Ignore"
        }));

        filters.Add <BaseTarget>((o, target) => target.Property != "Ignore");
        Assert.True(await filters.ShouldInclude(new object(), new ChildTarget()));
        Assert.True(await filters.ShouldInclude(new object(), new ChildTarget {
            Property = "Include"
        }));
        Assert.False(await filters.ShouldInclude(new object(), new ChildTarget {
            Property = "Ignore"
        }));

        filters.Add <ITarget>((o, target) => target.Property != "Ignore");
        Assert.True(await filters.ShouldInclude(new object(), new ImplementationTarget()));
        Assert.True(await filters.ShouldInclude(new object(), new ImplementationTarget {
            Property = "Include"
        }));
        Assert.False(await filters.ShouldInclude(new object(), new ImplementationTarget {
            Property = "Ignore"
        }));

        Assert.True(await filters.ShouldInclude(new object(), new NonTarget {
            Property = "Foo"
        }));
    }