web-dev-qa-db-ja.com

「型 'T'は参照型でなければならない」ときにメソッドをジェネリックにする方法は?

可能性のある複製:
C#ジェネリックメソッドで「エラー:…参照型でなければなりません」と表示される理由

ほぼ同じ2つのリポジトリメソッドがあります。

_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型であり、2つ目が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>()'

このジェネリックを他の方法にすることは可能ですか?

78
DaveDev

制約classを追加してみてください:

where T : class, ISearchableEntity
198
Mark Byers

Tで使用できる制約の完全なリストは次のとおりです。

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

29
theburningmonk