2010-08-30 11 views
8

¿Hay alguna forma de forzar restricciones para una definición genérica para implementar una "interfaz genérica" ​​... es decir, quiero que la clase admita pasar una interfaz y una clase genérica restringiéndola para que la clase implementa la interfaz. Por ejemplo, si digo:Forzar implementación de interfaz genérica en C#

MyGenericClass<IMyInterface, MyImplementation>.DoSomething(); 

que deberían estar constreñido por lo que MyImplementation implementa IMyInterface

Por lo que yo sé que se puede lograr mediante

public class Dynamic_Loader<T, S> where S: T 

Ahora, hay alguna forma de también forzar T a ser una interfaz?

Editar: El propósito de esto iba a tener algo como:

private static List<T> interfaceList = new List<T>(); 

public static List<T> InterfaceList {get { return interfaceList;}} 

public static void Add(S input) { interfaceList.Add(input);} 

y tienen la lista restringida únicamente a las interfaces (ya que se supone que volver implementaciones de ciertas interfaces)

Respuesta

7

¿Quiere decir que también se puede poner una restricción en T como where T : interface?

Si es así, entonces no: this list prácticamente cubre sus opciones.

Lo que tienes está lo más cerca posible, creo.

Por curiosidad, ¿cuál sería su razón para querer restringir T para ser una interfaz?

o te refieres a una restricción puede también ser puesto en T para T a aplicar algunos interfaz específica?

Si es así, entonces : simplemente tiene dos where cláusulas (por ejemplo, where S : T where T : U).

+0

Oh, yo iba para esto: Lista public static interfacelist = nueva lista ; public static void Add (S input); Y sí, también funcionará si T es solo una clase base pero el cliente debería obtener interfaces, no clases base. –

3
where T: IMyOtherInterfaceForT 

Ejemplo:

public class Test<T, V> 
    where T : V 
    where V : IEnumerable<int> 
    { 
    } 
1

Puede hacer algo como esto para aplicarlo en tiempo de ejecución en lugar de compilar.

public class Test<T> where T : class 
{ 
    public Test() 
    { 
    Type t = typeof(T); 
    if(!t.IsInterface) 
     throw new ArgumentException("T must be an interface type"); 
    } 
} 
Cuestiones relacionadas