表达式参数参考

时间:2018-09-05 13:21:54

标签: c# lambda syntax expression

我已经创建了一个下载管理器,但是就下载管理器存储下载参数而言,它运行良好。

        Downloader downloader = new Downloader();
        downloader.Add(new List<Query>(){
                            new Query(dataset.trans_sprzedaz_pozycje, () => dataset.PobierzTransSprzedazPozycja(downloader.Filter)),
                            new Query(dataset.trans_sprzedaz_rabaty_dodatkowe, () => dataset.PobierzDokumentySprzedazyRabaty(downloader.Filter)),
                            new Query(dataset.trans_sprzedaz_teksty, () => dataset.PobierzDokumentySprzedazyTeksty(downloader.Filter))
                            });

但是在某些情况下,我需要查询来存储参数,因此它看起来应该像这样:

        Downloader downloader = new Downloader();
        downloader.Add(new List<Query>(){
                            new Query(dataset.trans_sprzedaz_pozycje, () => dataset.PobierzTransSprzedazPozycja(query.Filter)),
                            new Query(dataset.trans_sprzedaz_rabaty_dodatkowe, () => dataset.PobierzDokumentySprzedazyRabaty(query.Filter)),
                            new Query(dataset.trans_sprzedaz_teksty, () => dataset.PobierzDokumentySprzedazyTeksty(query.Filter))
                            });

请注意,在第一个代码段中,我使用downloader.Filter,第二个代码中,我使用(伪造的)query.Filter

我知道我可以进行以下构造:

        var query = new Query(dsSprzedaz.trans_sprzedaz_pozycje);
        query.AddFunc(() => dsSprzedaz.PobierzTransSprzedazPozycja(query.Filter));

但是添加20-30个这样的查询会很糟糕。

我尝试过这样的解决方案:

            Filter filter;
            new Query(dsSprzedaz.trans_sprzedaz_pozycje,() => dsSprzedaz.PobierzTransSprzedazPozycja(filter), out filter),

但它会复制来自query.Filter的值,而不是引用的值。

//编辑

这是下载器中最重要的代码:

    private Task Execute()
    {
        var Tasks = new List<Task>(Queries.Count);

        foreach (var query in Queries)
        {
            var task = query.Execute(CancellationToken);
            Tasks.Add(task);
        }

        return Task.WhenAll(Tasks);
    }

    private void CreateFilter(List<long> id_list)
    {
        lock (Data)
        {
            Data.Clear();

            Data.Append("(0");

            foreach (var value in id_list)
                Data.Append("," + value);

            Data.Append(")");
        }
    }

    public string Filter
    {
        get
        {
            return Data.ToString();
        }
    }

并查询:

public class Query
{
    DataTable Source;
    Func<DataTable> Download;
    StringBuilder Data;

    public Query(DataTable Source, Expression<Func<DataTable>> Download, out string filter)
    {
        this.Source = Source;
        this.Data = new StringBuilder();

        filter = Filter;
        this.Download = Download.Compile();
    }

    public async Task Execute(CancellationToken cancellationToken)
    {
        try
        {
            DataTable result = await Task.Run(() => Download());

            if (cancellationToken.IsCancellationRequested) return;

            Source.Merge(result);
        }
        catch (Exception) { }
    }

    private void CreateFilter(List<long> id_list)
    {
        lock (Data)
        {
            Data.Clear();

            Data.Append("(0");

            foreach (var value in id_list)
                Data.Append("," + value);

            Data.Append(")");
        }
    }

    public string Filter
    {
        get
        {
            return Data.ToString();
        }
    }
}

`

1 个答案:

答案 0 :(得分:0)

  1. 使查询存储信息是否应使用其自己的过滤器(您说过只想使用它的过滤器几次,在其他情况下则要使用Downloader.Filter)

    public class Query
    {
        DataTable Source;
        Func<string, DataTable> Download;
        StringBuilder Data;
        public bool IsOwnFilter { get; set; }
    
        public Query(DataTable Source, Func<string, DataTable> Download, bool isOwnFilter = false)
        {
            this.Source = Source;
            this.Data = new StringBuilder();
            this.Download = Download;
            this.IsOwnFilter = isOwnFilter;
        }
    
        public async Task Execute(strign filter, CancellationToken cancellationToken)
        {
            try
            {
                DataTable result = await Task.Run(() => Download(filter));
                if (cancellationToken.IsCancellationRequested) return;
                Source.Merge(result);
            }
            catch (Exception) { }
        }
        // This is not used in your code
        private void CreateFilter(List<long> id_list)
        {
            lock (Data)
            {
                Data.Clear();
                Data.Append("(0");
                foreach (var value in id_list)
                    Data.Append("," + value);
    
                Data.Append(")");
            }
        }
    
        public string Filter
        {
            get
            {
                return Data.ToString();
            }
        }
    }
    
  2. 下一步,当您从Downloader调用它时,检查是否有新标记并通过正确的过滤器:

    private Task Execute()
    {
        var Tasks = new List<Task>(Queries.Count);
    
        foreach (var query in Queries)
        {
            // call Execute with Query filter or Downloader.Filter
            var task = query.Execute(query.IsOwnFilter ? query.Filter : Filter, CancellationToken);
            Tasks.Add(task);
        }
    
        return Task.WhenAll(Tasks);
    }
    

当您向Downloader添加查询时:

Downloader downloader = new Downloader();
        downloader.Add(new List<Query>(){
                            new Query(dataset.trans_sprzedaz_pozycje, (filter) => dataset.PobierzTransSprzedazPozycja(filter)),
                            new Query(dataset.trans_sprzedaz_rabaty_dodatkowe, (filter) => dataset.PobierzDokumentySprzedazyRabaty(filter)),
                            new Query(dataset.trans_sprzedaz_teksty, (filter) => dataset.PobierzDokumentySprzedazyTeksty(filter))
                            });