如何编写处理单个对象和集合的通用Save()方法?

时间:2009-12-19 03:04:52

标签: c# nhibernate generics save

我在存储库类中有两个通用的保存方法:

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>,并尝试使用第一种方法保存它。

如何编写此保存方法以便它可以处理任何一种情况,而不必显式提供类型?

4 个答案:

答案 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);
        }
    }

希望这会有所帮助!!