在nHibernate中使用ISession的CreateCritieria函数返回对象列表的通用函数

时间:2011-11-14 13:27:08

标签: c# nhibernate

我可以通过以下方式创建对象列表:

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 criteria = 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 个答案:

答案 0 :(得分:2)

通用类型参数可以进一步 constrained ,以限制可以作为此类参数提供的内容。您的错误消息是,NHibernate.ISession.CreateCriteria<T>()要求将其类型参数约束为引用类型。由于您的方法根本没有定义任何约束,因此C#编译器不知道TCreateCriteria<T>的有效类型参数。

如果我们仔细看看NHibernate源代码,我们确实可以注意到ISession.CreateCriteria<T>声明如下:

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

因此,您需要对方法使用相同的约束,以便传递给它的类型参数能够很好地与CreateCriteria调用一起使用。只需将其更改为:

public IList<T> GetObjList<T>(T obj)
    where T : class
{
    /* ... */
}

答案 1 :(得分:1)

尝试

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

这会将类型参数“T”限制为“类” - 这意味着此方法不会将值类型接受为“T”。