LINQ与通用参数

时间:2011-11-11 02:57:04

标签: .net linq

我有一个简单的功能来从DB获取会议室列表。 我正在使用以下功能:

    public List<ConferenceRoom> RunRoomQuery<T1>(T1 fieldValue, Func<ConferenceRoom, T1, bool> predicate)
    {
        var confRooms = _dataContext.ConferenceRooms.Where(delegate(ConferenceRoom c)
        {
            return predicate(c, fieldValue);
        });
        return confRooms.ToList();
    }

工作正常;但正如你所注意到的,我正在传递一个“ConferenceRoom”类型。 相反,我想让它更通用,并像这样传递T2:

    public List<T2> RunRoomQuery<T1,T2>(T1 fieldValue, Func<T2, T1, bool> predicate)
    {
        var confRooms = _dataContext.ConferenceRooms.Where(delegate(T2 c)
        {
            return predicate(c, fieldValue);
        });
        return confRooms.ToList();
    }

confRoom.ToList()没有编译,“Where”对此也不满意。

问题:为什么?什么是我失踪? 以下是错误:

error CS0305: Using the generic method 'ConferenceDB.ConferenceDb.RunRoomQuery<T1,T2>(T1, System.Func<T2,T1,bool>)' requires 2 type arguments
C:\Projects\ConferenceDB\ConferenceDB.cs(82,25): (Related location)
C:\Projects\ConferenceDB\ConferenceDB.cs(69,27): error CS0305: Using the generic method 'ConferenceDB.ConferenceDb.RunRoomQuery<T1,T2>(T1, System.Func<T2,T1,bool>)' requires 2 type arguments

为什么?

2 个答案:

答案 0 :(得分:1)

我相信您希望将List<ConferenceRoom>类型的列表投射到List<T2>

没有T2的限制,这是不可能的。

public List<T2> RunRoomQuery<T1,T2>(T1 fieldValue, Func<T2, T1, bool> predicate) where T2 : ConferenceRoom

我还怀疑_dataContext.ConferenceRooms的类型是IEnumerable<ConferenceRoom>,因此即使使用上述约束,它也无效。

我无法真正提供更好的解决方案,因为我不明白为什么要让它变得通用?

答案 1 :(得分:1)

_dataContext.ConferenceRoomsConferenceRoom s的集合 因此,Where()扩展方法需要ConferenceRoom,而不是T2


通用方法的要点是泛型 - 使用不同的类型 将方法设为通用是没有意义的,因为它只适用于ConferenceRoom s。