当“类型'T'必须是引用类型”时,如何使方法通用?

时间:2010-07-29 17:00:59

标签: c# nhibernate generics

  

可能重复:
  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>()'

我是否有可能以其他方式制作这种通用名称?

2 个答案:

答案 0 :(得分:195)

您可以尝试添加约束class

where T : class, ISearchableEntity

答案 1 :(得分:29)

以下是您可以在T

上使用的完整约束列表

http://msdn.microsoft.com/en-us/library/d5x73970.aspx