函数列表的元组列表
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();
现在,在我的实际代码中,我使用 LocalReport
(Microsoft.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);
我想像这样使用 Tuple
和 Func
:
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
泛型类型参数
有什么建议吗?
Entity1
、Entity2
和EntityN
都是不同的类型。 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 *** }
}
我使用 .NET 4.5.1 - VS 2012。
我有几个列表,不同的实体类型(Entity1、Entity2、.. EntityN)
List<Entity1> list1 = GetData1();
List<Entity2> list2 = GetData2();
List<EntityN> listN = GetDataN();
现在,在我的实际代码中,我使用 LocalReport
(Microsoft.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);
我想像这样使用 Tuple
和 Func
:
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
泛型类型参数
有什么建议吗?
Entity1
、Entity2
和EntityN
都是不同的类型。 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 *** }
}