我有很多类型的IWorkingPattern
界面......
public interface IWorkingPattern
{
TimeSpan Start { get; }
TimeSpan End { get; }
}
我希望能够将字典中的这些内容转换为Timeslot
的数字......
public class Timeslot
{
public Timeslot(DateTime start, DateTime end)
{
}
}
为实现这一目标,我编写了以下通用助手方法......
public IEnumerable<Timeslot> ToTimeslots<T>(IEnumerable<KeyValuePair<DateTime, IEnumerable<T>>> datePatterns)
where T : IWorkingPattern
{
Collection<Timeslot> timeslots = new Collection<Timeslot>();
foreach (KeyValuePair<DateTime, IEnumerable<T>> datePattern in datePatterns)
foreach (IEnumerable<T> pattern in datePattern.Value)
timeslots.Add(new Timeslot(datePattern.Key + pattern.Start, datePattern.Key + pattern.End));
return timeslots;
}
但是,在尝试完成时,我为每个Start
和End
属性收到2个错误:
&#39; System.Collections.Generic.IEnumerable&#39;不包含&#39; XXX&#39;的定义没有扩展方法&#39; XXX&#39;接受类型为'System.Collections.Generic.IEnumerable&#39;的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)
我可以通过在第二个foreach循环中转换每个pattern
来实现这一点(例如:((IWorkingPattern)pattern).Start
。但是我确定我不应该因为接口约束而这样做。
我做错了什么?
答案 0 :(得分:3)
foreach (IEnumerable<T> pattern in datePattern.Value)
此代码可能不正确,因为您已经知道datePattern.Value
是IEnumerable<T>
的{{1}}。
虽然我没有测试过,但我怀疑这应该是
foreach
答案 1 :(得分:0)
您正试图在IWorkingPattern
IEnumerable
T
T
IWorkingPattern
IWorkingPattern
foreach (var pattern in datePattern.Value)
{{1}}上使用{{1}}的属性。如果要访问集合中每个{{1}}的属性,则必须正确枚举它。例如:
{{1}}
另外,为什么在限制为一个接口的情况下制作通用方法?