2011-03-16 21 views
6

Esto es lo que me gustaría hacer:¿Se puede especificar en una restricción de tipo genérico que debe implementar un tipo genérico?

public interface IRepository<TSet<TElement>> where TSet<TElement> : IEnumerable<TElement> 
{ 
    TSet<TEntity> GetSet<TEntity>(); 
} 

es una construcción posible en tales .NET?

Editar: La pregunta no era lo suficientemente clara. Esto es lo que quiero hacer, ampliado:

public class DbRepository : IRepository<DbSet<TElement>> { 
    DbSet<TEntity> GetSet<TEntity>(); 
} 

public class ObjectRepository : IRepository<ObjectSet<TElement>> { 
    ObjectSet<TEntity> GetSet<TEntity>(); 
} 

Significado, quiero el tipo limitado a: - aceptar un único parámetro genérico - implementar una interfaz parámetro genérico solo dado.

¿Es esto posible? De hecho, seré feliz solo con lo primero.

public interface IRepository<TGeneric<TElement>> { 
    TGeneric<TArgument> GetThing<TArgument>(); 
} 
+1

Es posible pero ¿cuál es el punto? Si 'TSet ' implementa 'IEnumerable ', también podría establecer la restricción en 'IEnumerable '. – Aliostad

+0

@Aliostad: ver la edición. Quiero configurar "TElement" solo cuando se llama a la función, no como un parámetro de tipo en la interfaz. –

+0

¿Son elementos de 'Element's y' Entity's? – AakashM

Respuesta

5

Usted tendría que utilizar dos tipos genéricos para lograrlo, tales como:

public interface IRepository<TCollection, TItem> where TCollection : IEnumerable<TItem> 
{ 
    TCollection GetSet<TItem>(); 
} 

(Asumo TEntity debería haber sido TElement en el original ...)

Una vez dicho esto, es mejor escribir algo como:

public interface IRepository<T> 
{ 
    IEnumerable<T> GetSet<T>(); 
} 

Este sería un medio más común de lograr lo anterior.

+0

Ver la edición: no quiero establecer el tipo de parámetro para el enumerable al mismo tiempo que la interfaz, pero solo cuando se invoca el método 'GetSet'. –

+0

Después de la revisión, esa es en realidad la respuesta correcta. –

0

Al final, eso no parece posible.

finalmente trabajé en torno a que mediante la definición de mi propia interfaz:

interfaz pública IRepository { IMySet GetSet(); }

Y envolví DbSet y ObjectSet en los objetos que implementan estas interfaces.

Cuestiones relacionadas