2010-07-29 5 views
69

Possible Duplicate:
Why do I get “error: … must be a reference type” in my C# generic method?Comment rendre une méthode générique quand "type 'T' doit être un type de référence"?

J'ai 2 méthodes de dépôt 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 _session.CreateCriteria est de type Fund et le second est company

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

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

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

+0

Are '' Fund' et classes company'? – AllenG

+0

@AllenG, oui, Fund & Company sont des classes – DaveDev

+0

Pourrait également éventuellement regarder le code source de la fonction CreateCriteria et voir comment ils le contraignent à un type de référence et peut-être vous pourriez employer la même méthode pour contraindre votre type générique à un type de référence. – AaronLS

Répondre

173

Vous pouvez essayer d'ajouter la contrainte class:

where T : class, ISearchableEntity 
+2

Au début, j'ai supposé que cela ne fonctionnait que si T devait être une classe, mais après avoir regardé la page liée dans la réponse theburningmonk, j'ai découvert que malgré le nom de cette contrainte, ceci s'applique aussi à toute classe, interface, délégué ou type de tableau. " Donc, utilisez 'where T: class' même si vous avez besoin de T pour être une interface, comme c'était mon cas. –

+0

Cela fonctionne aussi pour struct –

Questions connexes