【发布时间】:2015-08-26 12:35:57
【问题描述】:
我正在使用一个名为 DDay ICal 的类库。 它是在 Outlook 日历和许多更多系统中实现的 iCalendar 系统的 C# 包装器。 我的问题源于我在这个系统上所做的一些工作。
这里有 3 个有问题的对象
- IRecurrencePattern - 接口
- RecurrencePattern - IRecurrencePattern 接口的实现
- DbRecurPatt - 具有隐式类型运算符的自定义类
IRecurrencePattern:未显示所有代码
public interface IRecurrencePattern
{
string Data { get; set; }
}
RecurrencePattern:未显示所有代码
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 系统中,他们使用ILists 来包含日历中每个事件的重复模式集合,自定义类用于从数据库中获取信息,然后进行转换通过隐式类型转换运算符到递归模式。
但是在代码中,我注意到它在从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 对象上而不是接口上,这是正确的吗? (我是接口和隐式运算符的新手)
【问题讨论】:
-
a
List<DbRecurPatt>是一个实际对象。您不能将其转换为List<IRecurrencePattern>,因为有人可能会尝试将非DbRecurPatt填充到其中。 -
应该注意的是,从
RecurrencePattern到IRecurrencePattern的转换将引用同一个对象,但是从DbRecurPatt到RecurrencePattern的转换创建了一个全新的对象。因此,在将其称为接口之前,您需要告诉它创建新对象。
标签: c# linq interface implicit-conversion data-conversion