ほぼ同じ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>()'
このジェネリックを他の方法にすることは可能ですか?
制約class
を追加してみてください:
where T : class, ISearchableEntity
Tで使用できる制約の完全なリストは次のとおりです。