函数列表的元组列表

Tuple List of Func List

我使用 .NET 4.5.1 - VS 2012。

我有几个列表,不同的实体类型(Entity1、Entity2、.. EntityN)

   List<Entity1> list1 = GetData1();
   List<Entity2> list2 = GetData2();
   List<EntityN> listN = GetDataN();

现在,在我的实际代码中,我使用 LocalReportMicrosoft.Reporting.WebForms)和 DataSources,如下所示:

   var rds1 = new ReportDataSource("data1", list1);
   localReport.DataSources.Add(rds1);
   var rds2 = new ReportDataSource("data2", list2);
   localReport.DataSources.Add(rds2);
   var rdsN = new ReportDataSource("dataN", listN);
   localReport.DataSources.Add(rdsN);

我想像这样使用 TupleFunc:

        var dataSources = new List<Tuple<string, Func<List<T>>>> 
        {
            Tuple.Create<string, Func<List<T>>>("data1", () => { return list1; }),
            Tuple.Create<string, Func<List<T>>>("data2", () => { return list2; }),
            Tuple.Create<string, Func<List<T>>>("dataN", () => { return listN; }),
        };

用法

 GenerateRDLC(dataSources);

生成RDLC代码

   public static void GenerateRDLC(List<Tuple<string, Func<List<T>>>> listFunc)
    {
            // ...CODE OMITTED...
            foreach (var t in listFunc)
            {
                var ds= t.Item1;
                var f= t.Item2;

                if (f != null)
                {
                    var list= f();
                    renderer.ReportInstance.DataSources.Add(new ReportDataSource(ds, list));
                }
            }
            // ...CODE OMITTED...
    }

但不能为我编译 (List<T>)

问题Tuple.Create<string, Func<List<T>>>("data1", () => { return list1; }),

我有几个类型 Entity1, Entity2, .. EntityN,没有一个 T 泛型类型参数

有什么建议吗?

Entity1Entity2EntityN都是不同的类型。 T 需要只有一种类型,所以代码无法编译。

即使所有三个共享一个共同的 interface/base class,因为 List<T> 是不变的,您不能从 List<Entity1> 转换为 List<IEntity>

解决方案 我使用 List<IEnumerable>

List<Tuple<string, Func<IEnumerable>>> 

列表

 List<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable

源代码

  var dataSources = new List<Tuple<string, Func<IEnumerable>>> 
            {
                Tuple.Create<string, Func<IEnumerable>>("table1", () => { return list1; }),
                Tuple.Create<string, Func<IEnumerable>>("table2", () => { return list2; }),
            };

            ReportingManager.GenerateRDLC(reportPath, "MyReport", formato, new ReportParameter[] { }, dataSources);

生成RDLC方法:

public static void GenerateRDLC(List<Tuple<string, Func<IEnumerable>>> listaDataSourcesYFuncGetDataForDataSources)
    {
            // *** code ommitted ***
            foreach (var tuplaDataSourceYFunc in listaDataSourcesYFuncGetDataForDataSources)
            {
                var dataSourceName = tuplaDataSourceYFunc.Item1;
                var funcGetDataForDataSources = tuplaDataSourceYFunc.Item2;

                if (funcGetDataForDataSources != null)
                {
                    var listaDatos = funcGetDataForDataSources();
                    renderer.ReportInstance.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource(dataSourceName, listaDatos));
                }
            }
            // *** code ommitted ***            }
    }