可能重复:
Why do I get “error: … must be a reference type” in my C# generic method?
我有两个几乎相同的存储库方法:
public IList<Fund> GetFundsByName(int pageSize, string searchExpression)
{
return _session.CreateCriteria<Fund>()
.AddNameSearchCriteria<Fund>(searchExpression)
.AddOrder<Fund>(f => f.Name, Order.Asc)
.SetMaxResults(pageSize).List<Fund>();
}
public IList<Company> GetCompaniesByName(int pageSize, string searchExpression)
{
return _session.CreateCriteria<Company>()
.AddNameSearchCriteria<Company>(searchExpression)
.AddOrder<Company>(f => f.Name, Order.Asc)
.SetMaxResults(pageSize).List<Company>();
}
唯一的区别是第一个_session.CreateCriteria
属于Fund
类型,第二个属于company
我希望通过将方法定义更改为:
来实现此通用public IList<T> GetEntitiesByName<T>(int pageSize, string searchExpression)
where T : ISearchableEntity
{
return _session.CreateCriteria<T>()
.AddNameSearchCriteria<T>(searchExpression)
.AddOrder<T>(f => f.Name, Order.Asc)
.SetMaxResults(pageSize).List<T>();
}
其中ISearchableEntity定义为:
public interface ISearchableEntity
{
string Name { get; set; }
}
但不幸的是NHibernate不喜欢这个并给我错误:
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 :(得分:195)
您可以尝试添加约束class
:
where T : class, ISearchableEntity
答案 1 :(得分:29)
以下是您可以在T
上使用的完整约束列表