我使用的是.NET 4.5.1 - VS 2012。
我有几个List,不同的实体类型(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);
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
泛型类型参数
有什么建议吗?
答案 0 :(得分:0)
Entity1
,Entity2
和EntityN
都是不同的类型。 <{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 *** }
}