2015-11-24 60 views
-1

通用的限制我有很多类型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; 
    } 

然而,试图完成时,我得到2个错误的StartEnd性能各一句话:

“System.Collections.Generic.IEnumerable”不包含“XXX”,没有扩展方法“XXX的定义“接受一个类型的第一个参数‘System.Collections.Generic.IEnumerable’可以找到(是否缺少using指令或程序集引用?)

我可以在第二投射每个pattern得到这个工作foreach循环(如:((IWorkingPattern)pattern).Start。不过,我相信我不应该因为接口约束而这样做。

我在做什么错?

+3

如果你有'其中T:IWorkingPattern'为什么不利用它'IWorkingPattern'代替'在T'第一名? – TheLethalCoder

+3

'pattern'是'IEnumerable ',但你试图从'T'中选择'Start'和'End'。编译器告诉你'IEnumerable '与'T'不一样。 –

+0

你也试图在'IEnumerable'上实现该方法,而不是在其内部的特定对象上。或者@Brian说的是什么 – TheLethalCoder

回答

3
foreach (IEnumerable<T> pattern in datePattern.Value) 

此代码不可能是正确的,你已经知道datePattern.Value是从以前的foreachIEnumerable<T>

虽然我没有测试过,我猜想这应该是

foreach (T pattern in datePattern.Value) 
+0

....或者'foreach(var pattern in datePattern.Value)' – Powerlord

0

您正在尝试使用的IEnumerable上的IWorkingPattern的属性,其中TIWorkingPattern。如果要访问集合中每个IWorkingPattern的属性,则必须正确枚举它。例如:

foreach (var pattern in datePattern.Value) 

此外,为什么当它被限制到一个接口时,使一个通用的方法?

+0

如上所述,使用泛型允许我在字典中传递派生类型,如果将我的参数紧紧地耦合到'IWorkingPattern'接口,我将不得不明确地强制类型转换。泛型允许我通过任何字典,只要'IEnumerable '中的'T'来自我的约束。 ToTimeslots(新字典>())'不会编译,如果我没有使用泛型。 –

+0

@AndyClark我在发布答案后看到了评论,无后顾之忧 – TheLethalCoder