如何通过LINQ调用函数委托?

时间:2011-07-19 13:19:06

标签: c# linq generics .net-4.0 delegates

我想我在这里问正确的问题......

我有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;
}

请参阅我对有关问题的方法声明的评论。我怎样才能正确完成这个?我的目标是不要多次复制/粘贴相同的代码...试图遵循DRY原则。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

使我的mapObj函数如下(根据评论中的@Jon Skeet建议)允许它编译并运行:

private static List<MyObj> mapObj<T>(Func<IEnumerable<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;
}

这导致了关于字段映射的新问题,但我会在一个新问题中提出这个问题。

相关问题