82 votes

Comment rendre une méthode générique quand "le type 'T' doit être un type de référence"?

Double Possible:
Pourquoi je reçois le message “erreur: ... doit être un type de référence” dans mon C# méthode générique?

J'ai 2 Référentiel des méthodes qui sont presque identiques:

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>();
}

La seule différence est que le premier de l' _session.CreateCriteria est de type Fund et le second, company

J'espérais que je pourrais faire à ce générique en modifiant la définition de la méthode pour:

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>();
}

où ISearchableEntity est défini comme:

public interface ISearchableEntity
{
    string Name { get; set; }
}

mais, malheureusement, NHibernate n'aime pas cela et me donne l'erreur:

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>()'

Est-il possible pour moi de faire ce générique d'une autre façon?

212voto

Mark Byers Points 318575

Vous pouvez essayer d'ajouter la contrainte class :

 where T : class, ISearchableEntity
 

29voto

theburningmonk Points 5590

Voici la liste complète des contraintes que vous pouvez utiliser sur T

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X