1. ホーム
  2. c#

[解決済み] 型 'T' は参照型でなければならない」場合、メソッドをジェネリックにするにはどうしたらいいですか?重複

2023-08-10 17:58:48

質問

重複の可能性があります。

なぜ私は私のC#ジェネリックメソッドで "エラー:...参照型でなければなりません "を得るのですか?

2つのRepositoryメソッドがありますが、ほとんど同じです。

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