我有一个简单的功能来从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
为什么?
答案 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.ConferenceRooms
是ConferenceRoom
s的集合
因此,Where()
扩展方法需要ConferenceRoom
,而不是T2
。
通用方法的要点是泛型 - 使用不同的类型
将方法设为通用是没有意义的,因为它只适用于ConferenceRoom
s。