【发布时间】:2015-05-27 23:57:30
【问题描述】:
我有以下四个重载的方法Add:
public IEnumerable<TrackInfo> Add(DataContext dataContext, IEnumerable<TrackInfo> tracks)
{
return tracks.Select(t => Add(dataContext, t));
}
public IEnumerable<TrackInfo> Add(DataContext dataContext, IEnumerable<string> files)
{
return files.Select(f => Add(dataContext, f));
}
public TrackInfo Add(DataContext dataContext, TrackInfo track)
{
dataContext.TrackInfos.InsertOnSubmit(track);
Add(track);
return track;
}
public TrackInfo Add(DataContext dataContext, string path)
{
return Add(dataContext, new TrackInfo(path));
}
有没有办法让第一次和第二次重载成为泛型函数?其他一些抽象机制也会有所帮助。
澄清我的意思(这不会编译!):
public IEnumerable<TrackInfo> Add<T>(DataContext dataContext, IEnumerable<T> items) where T : TrackInfo, string
{
return items.Select(i => Add(dataContext, i));
}
首先,我不能使用字符串作为约束,因为它是密封的。其次,我认为我不能以这种方式指定多个约束。有什么解决办法吗?
【问题讨论】:
-
我“认为”这就是你想要的stackoverflow.com/questions/3197849/…
-
所以第一个和第二个重载调用第三个重载。第四个重载调用第三个,第三个调用未知的第五个重载?
-
Add(TrackInfo) 是 Collection
成员。 -
@DerekSrickland 不太可能。我认为 OP 想要基于泛型类型神奇地调用非泛型覆盖
Add(...TrackInfo track)和Add(...string path)之一,但如果没有一些运行时分辨率就无法完成 - 使用巧妙放置的dynamic是常见的解决方案。 .. -
和我想的一样。解决“问题”会大大降低可读性。我会坚持使用多个重载。
标签: c# generics ienumerable