我在存储库类中有两个通用的保存方法:
public void Save<T>(T entity)
{
_session.Save(entity);
}
public void Save<T>(IEnumerable<T> entities)
{
foreach (var item in entities)
{
_session.Save(item);
}
}
但是,当我使用Save(collection)
(自动推断类型)时,它会将其识别为T
而不是IEnumerable<T>
,并尝试使用第一种方法保存它。
如何编写此保存方法以便它可以处理任何一种情况,而不必显式提供类型?
答案 0 :(得分:4)
将类型参数放在存储库的类级别而不是方法级别,这样重载就不会模糊不清。
class Repo<T>
{
public void Save(T entity)
{
_session.Save(entity);
}
public void Save(IEnumerable<T> entities)
{
foreach (var item in entities)
{
_session.Save(item);
}
}
}
你会这样使用它:
var repo = new Repo<Person>();
var p = new Person();
repo.Save(p);
var ps = new Person[] { p };
repo.Save(ps);
答案 1 :(得分:1)
您不能依赖于此特定情况的类型推断。 <T>(T)
将满足任何类型,因此推断将不会继续搜索以找到仍然符合签名的更具体的约束。
答案 2 :(得分:0)
什么打扰重载方法?,最好不要这样做:
public void Save<T>(T entity)
{
if (T is IEnumerable)
{
foreach (var item in entity)
_session..Save(item);
} else {
_session.Save(entity);
}
}
答案 3 :(得分:0)
您也可以这样使用它:
public void Save<T>(T entity)
{
if (typeof(T).GetInterfaces().Contains(typeof(IEnumerable)))
{
SaveEnumerable(entity as IEnumerable);
}
else
{
_session.Save(entity);
}
}
public void SaveEnumerable(IEnumerable entities)
{
foreach (var item in entities)
{
_session.Save(item);
}
}
希望这会有所帮助!!