我可以通过以下方式创建对象列表:
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>()'
请帮我解决这个问题。
答案 0 :(得分:2)
通用类型参数可以进一步 constrained ,以限制可以作为此类参数提供的内容。您的错误消息是,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 :(得分:1)
尝试
public IList<T> GetObjList <T> (T obj) where T : class
{
// body doesn't change
}
这会将类型参数“T”限制为“类” - 这意味着此方法不会将值类型接受为“T”。