2010-07-29 10 views
69

Possible Duplicate:
Why do I get “error: … must be a reference type” in my C# generic method?¿Cómo hacer un método genérico cuando "tipo 'T' debe ser un tipo de referencia"?

tengo 2 métodos del repositorio que son casi idénticos:

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 única diferencia es que de la primera uno _session.CreateCriteria es de tipo Fund y el segundo es company

que estaba esperando que podría hacer esto genérico cambiando la definición del método a:

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

donde ISearchableEntity se define como:

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

NHibernate pero desafortunadamente no le gusta esto y me da el error:

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

¿Es posible para mí hacer esta genérica alguna otra ¿camino?

+0

Son '' Clases Fund' y company' Aquí? – AllenG

+0

@AllenG, sí, Fund & Company son las clases – DaveDev

+0

También podría mirar el código fuente de la función CreateCriteria y ver cómo lo restringen a un tipo de referencia y quizás podría emplear el mismo método para restringir su tipo genérico a un tipo de referencia. – AaronLS

Respuesta

173

Usted podría intentar agregar la restricción class:

where T : class, ISearchableEntity 
+2

Al principio asumí que esto solo funcionaba si T tenía que ser una Clase, pero después de mirar la página vinculada en la respuesta de Burningmonk descubrí que, a pesar del nombre de esta restricción, "esto se aplica también a cualquier clase, interfaz, delegado o tipo de matriz ". Entonces use 'where T: class' incluso si necesita que T sea una interfaz, como era mi caso. –

+0

Esto también funciona para struct –

Cuestiones relacionadas