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

C# “当”时如何使方法通用;类型';T';必须是引用类型";?,c#,generics,C#,Generics,可能重复: 我有两种几乎相同的存储库方法: public IList<Fund> GetFundsByName(int pageSize, string searchExpression) { return _session.CreateCriteria<Fund>() .AddNameSearchCriteria<Fund>(searchExpression) .AddOrder<Fund>(f =>

可能重复:

我有两种几乎相同的存储库方法:

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>();
}
其中ISearchableEntity定义为:

public interface ISearchableEntity
{
    string Name { get; set; }
}
但不幸的是,NHibernate不喜欢这样,给了我一个错误:

类型“T”必须是引用类型,才能将其用作泛型类型或方法“NHibernate.ISession.CreateCriteria()”中的参数“T”


我是否可以以其他方式将此设置为通用设置?

您可以尝试添加约束

where T : class, ISearchableEntity

下面是可以在T上使用的约束的完整列表


Fund
Company
类吗?@AllenG,是的,Fund&Company是类。我们还可以看看CreateCriteria函数sourcecode,看看它们是如何将其约束到引用类型的,也许您可以使用相同的方法将泛型类型约束到引用类型。我喜欢这一点这是一个值得注意的问题,它已经“完全复制”了“在近两年的时间里:-/就像通常的情况一样,很明显,一旦你理解了答案,这些问题就是同一个问题。我称之为多重搜索向量——不同的查询路径导致相同的理解。Nazis的规则似乎认为支持多个搜索向量是没有用的。注意:如果一个人正在调用一个方法并得到了这个错误,Int32?(例如)将不作为引用类型工作,但数组Int32?[]将作为引用类型工作!起初,我假设这只在T必须是类的情况下才有效,但在查看BurningMonk答案中链接的页面后,我发现尽管有此约束的名称,“这也适用于任何类、接口、委托或数组类型。”因此使用
where T:Class
,即使您需要T是接口,就像我的情况一样,这也适用于struct
where T : class, ISearchableEntity