我有以下四个方法重载:
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));
}
有没有什么办法可以让 first 和 second 重载成为泛型函数?其他一些抽象机制也会有所帮助。
澄清我的意思(这不会编译!):
public IEnumerable<TrackInfo> Add<T>(DataContext dataContext, IEnumerable<T> items) where T : TrackInfo, string
{
return items.Select(i => Add(dataContext, i));
}
首先,我不能使用字符串作为约束,因为它是密封的。其次,我不认为我可以通过这种方式指定多个约束。有什么解决办法吗?
最佳答案
不是最佳答案,但我认为这可能是您想要的:
public IEnumerable<TrackInfo> Add<T>(DataContext dataContext, IEnumerable<T> tracks) where T : class
{
if(typeof(T) == typeof(string))
{
return tracks.Select(t => Add(dataContext, new TrackInfo(t)));
}
else if(typeof(T) == typeof(TrackInfo))
{
return tracks.Select(t => Add(dataContext, t as TrackInfo));
}
else
{
throw new ArgumentException("The type must be string or TrackInfo");
}
}
public TrackInfo Add(DataContext dataContext, TrackInfo track)
{
dataContext.TrackInfos.InsertOnSubmit(track);
Add(track);
return track;
}
// you may not need this
public TrackInfo Add(DataContext dataContext, string path)
{
return Add(dataContext, new TrackInfo(path));
}
关于c# - 泛型方法的多重约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30495064/