【发布时间】:2011-07-19 13:19:06
【问题描述】:
我想我在这里问的问题是正确的......
我有 4 个存储过程,它们返回相同数据的不同子集。
我将此数据映射到我的服务器应用程序中的同一对象。
我的代码设置如下:
internal static MyDataContext dc = new MyDataContext();
internal static List<MyObj> getData(DataType data)
{
List<MyObj> obj = null;
switch (data)
{
case DataType.Type1:
obj = mapObj(dc.getDataType1);
break;
case DateType.Type2:
obj = mapObj(dc.getDataType2);
break;
...
}
}
// This gives me an error that type T cannot be defined
// private static List<MyObj> mapObj(Func<T> getDataForObj)
// This gives me an error calling the function (Cannot find implementation of query pattern for source type T
private static List<MyObj> mapObj<T>(Func<T> getDataForObj)
{
List<MyObj> obj = new List<MyObj>();
var result = from a in getDataForObj()
select a;
foreach (var row in result)
{
... // map objs
}
return obj;
}
有关我遇到的问题的方法声明,请参阅我的 cmets。我将如何正确地做到这一点?我的目标是不要多次复制/粘贴相同的代码……尝试遵循 DRY 原则。提前感谢您的帮助。
【问题讨论】:
-
您还没有显示
delegateForType1或delegateForType2是什么。 -
@Jon Skeet:它们都是使用 linq2sql 类对存储过程的调用。
DataContext.StoredProcedure1();所以他们返回IEnumerable<StoredProcResult> -
但是它们在编译时是什么类型?我怀疑您只需要在您的
mapObj方法中将Func<T>更改为Func<IEnumerable<T>>,但是如果没有更多信息就很难确定。演示问题的简短但完整程序将非常有帮助。 -
添加 Func
> 帮助...现在我的映射中的字段没有解析,因为 T 没有定义它们...嗯,新问题,我想。
标签: c# linq generics .net-4.0 delegates