public void GetShownColumns_Ok()
    {
        var localizer = Context.Services.GetRequiredService <IStringLocalizer <Foo> >();
        var fooData   = GenerateDataTable(localizer);
        var context   = new DataTableDynamicContext(fooData, AddAttributesCallback(localizer),
                                                    invisibleColumns: new string[] { nameof(Foo.DateTime) },
                                                    shownColumns: new string[] { nameof(Foo.Name) },
                                                    hiddenColumns: new string[] { nameof(Foo.Count) });

        Assert.Equal(4, context.GetColumns().Count());
    }
    public async Task DataTableDynamicContext_Ok()
    {
        var added     = false;
        var deleted   = false;
        var localizer = Context.Services.GetRequiredService <IStringLocalizer <Foo> >();
        var fooData   = GenerateDataTable(localizer);
        var context   = new DataTableDynamicContext(fooData, AddAttributesCallback(localizer))
        {
            OnAddAsync = foos =>
            {
                added = true;
                return(Task.CompletedTask);
            },
            OnDeleteAsync = foos =>
            {
                deleted = true;
                return(Task.FromResult(true));
            }
        };

        var cols = context.GetColumns();

        Assert.NotEmpty(cols);

        var items = context.GetItems();

        Assert.NotEmpty(items);

        await context.OnAddAsync(new IDynamicObject[] { Utility.Clone(items.First()) });

        Assert.True(added);

        await context.OnDeleteAsync(items);

        Assert.True(deleted);
    }