Func列表的元组列表

时间:2015-11-10 13:45:21

标签: c# generics lambda tuples func

我使用的是.NET 4.5.1 - VS 2012。

我有几个List,不同的实体类型(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);

GenerateRDLC代码

   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泛型类型参数

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

Entity1Entity2EntityN都是不同的类型。 <{1}}只需要一种类型,因此代码无法编译。

即使所有三个共享一个公共接口/基类,因为T是不变的,你也不能从List<T>转换为List<Entity1>

答案 1 :(得分:0)

使用List<IEnumerable>

解决方案

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

<强>列表&LT; T&gt;

 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);

GenerateRDLC方法:

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 ***            }
    }