Универсальная функция для возврата списка объектов, используя функцию CreateCritieria ISession в nHibernate - PullRequest
1 голос
/ 14 ноября 2011

Я мог бы создать список объектов следующим образом:

using (var session = sessionFactory.OpenSession()) {              
    ICriteria criteria = session.CreateCriteria<Foo>();
    IList<Foo> Foo = criteria.List<Foo>();
}

, где Foo - мой класс.

Я хочу написать обобщенную функцию для возврата списка объектов.в зависимости от типа ввода, как показано ниже:

public IList<T> GetObjList <T> (T obj)
{
    IList<T> list;
    try {
        var sessionFactory = CreateSessionFactory();
        if (sessionFactory == null)
            return null;
        using (var session = sessionFactory.OpenSession()) {
            ICriteria criteria = session.CreateCriteria<T>(); //Error
            list = criteria.List<T>();
        }
    }
    catch (Exception ex) {
        MessageBox.Show(ex.Message);
        return null;
    }
    return list;
}

Я получаю следующую ошибку компилятора в строке ICriteria attribute = session.CreateCriteria ()

The type 'T' must be a reference type in order to use it as parameter 'T' in the generic type or method 'NHibernate.ISession.CreateCriteria<T>()'

решить это.

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Параметры общего типа могут быть дополнительно ограничены для ограничения того, что может быть предоставлено в качестве такого параметра. Ваше сообщение об ошибке говорит о том, что NHibernate.ISession.CreateCriteria<T>() требует, чтобы его параметр типа был ограничен ссылочным типом . Поскольку ваш метод вообще не определяет никаких ограничений, компилятор C # понятия не имеет, является ли T допустимым параметром типа для CreateCriteria<T>.

Если мы более внимательно посмотрим на исходный код NHibernate, мы действительно можем заметить, что ISession.CreateCriteria<T> объявлен следующим образом:

public ICriteria CreateCriteria<T>() where T : class

В результате вам нужно такое же ограничение для вашего метода, чтобы передаваемый ему параметр типа хорошо работал при вызове CreateCriteria. Просто измените его на:

public IList<T> GetObjList<T>(T obj)
    where T : class
{
    /* ... */
}
1 голос
/ 14 ноября 2011

попробуй

public IList<T> GetObjList <T> (T obj) where T : class
{
    // body doesn't change
}

Это ограничивает параметр типа «T» как «класс» - это означает, что этот метод не будет принимать тип значения как «T».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...