Как мне написать универсальный метод Save (), который обрабатывает отдельные объекты и коллекции? - PullRequest
2 голосов
/ 19 декабря 2009

У меня есть два общих метода сохранения в классе репозитория:

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 ]

4 голосов
/ 19 декабря 2009

Поместите параметр типа на уровне класса в вашем хранилище, а не на уровне метода, чтобы перегрузка не была неоднозначной.

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 голос
/ 19 декабря 2009

Вы не можете полагаться на вывод типа для этого конкретного случая. <T>(T) будет удовлетворять любому типу, поэтому вывод не будет продолжать поиск, чтобы найти более конкретные ограничения, которые все еще соответствуют сигнатуре.

0 голосов
/ 19 декабря 2009

Вы можете использовать это так же:

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

Надеюсь, это поможет !!

0 голосов
/ 19 декабря 2009

Зачем беспокоиться о перегруженных методах? Не лучше сделать это так:

public void Save<T>(T entity)
{
    if (T is IEnumerable)
    {
         foreach (var item in entity)
              _session..Save(item);
    } else  {
        _session.Save(entity);
    }
}
...