这里有三个相关对象:
- IRecurrencePattern - 接口 - RecurrencePattern - 实现IRecurrencePattern接口的类 - DbRecurPatt - 具有隐式类型操作符的自定义类
IRecurrencePattern:并非所有代码都被展示。
public interface IRecurrencePattern
{
string Data { get; set; }
}
重复模式:并非所有代码都显示
public class RecurrencePattern : IRecurrencePattern
{
public string Data { get; set; }
}
DbRecurPatt:并非所有代码都显示
public class DbRecurPatt
{
public string Name { get; set; }
public string Description { get; set; }
public static implicit operator RecurrencePattern(DbRecurPatt obj)
{
return new RecurrencePattern() { Data = $"{Name} - {Description}" };
}
}
混淆的部分:在DDay.ICal系统中,他们使用
IList
来包含每个日历事件的重复模式集合,自定义类用于从数据库获取信息,然后通过隐式类型转换运算符将其转换为Recurrence Pattern。但是在代码中,我注意到当将
List<DbRecurPatt>
转换为List<IRecurrencePattern>
时,它经常崩溃。我意识到需要先转换为RecurrencePattern
,然后再转换为IRecurrencePattern
(因为集合中还包括其他实现IRecurrencePattern
的类,它们的实现方式不同)。var unsorted = new List<DbRecurPatt>{ new DbRecurPatt(), new DbRecurPatt() };
var sorted = unsorted.Select(t => (IRecurrencePattern)t);
上述代码无法运行,会在
IRecurrencePattern
处抛出错误。var sorted = unsorted.Select(t => (IRecurrencePattern)(RecurrencePattern)t);
这个确实可以工作,所以我的问题是:为什么第一个方法不能工作?(有没有改进这种方法的方式?)
我相信这可能是因为隐式操作符在 RecurrencePattern
对象上而不是接口上,这是正确的吗?(我对接口和隐式操作符都很新手)
List<DbRecurPatt>
是一个实际对象。您不能将其强制转换为List<IRecurrencePattern>
,因为某些人可能会试图将非DbRecurPatt
对象存入其中。 - Damien_The_UnbelieverRecurrencePattern
到IRecurrencePattern
的转换将引用相同的对象,但是从DbRecurPatt
到RecurrencePattern
的转换将创建一个全新的对象。因此,在将其作为接口引用之前,您需要告诉它创建新对象。 - juharr