繁体   English   中英

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

[英]Generic function to return list of objects using ISession's CreateCritieria function in 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>()'

请帮我解决这个问题。

可以进一步约束通用类型参数以限制可以作为这样的参数提供的内容。 您的错误消息是什么, 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
{
    /* ... */
}

尝试

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM