2010-08-30 5 views
8

Esiste comunque una forzatura di un vincolo per una definizione generica per implementare una "interfaccia generica" ​​... ovvero, voglio che la classe supporti il ​​passaggio di un'interfaccia e una classe generica che lo vincola in modo che la classe implementa l'interfaccia. Per esempio, se io dico:Implementazione di un'interfaccia generica in C#

MyGenericClass<IMyInterface, MyImplementation>.DoSomething(); 

che dovrebbe essere vincolato in modo che MyImplementation implementa IMyInterface

Per quanto ne so che si può ottenere con

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

Ora, c'è comunque di anche forza T per essere un'interfaccia?

Edit: Lo scopo di questo è stato quello di avere qualcosa di simile:

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

e avere la lista ristretta ai soli interfacce (in quanto deve restituire le implementazioni di alcune interfacce)

risposta

7

Vuoi dire, si può anche mettere un vincolo su T come where T : interface?

Se sì, quindi no: this list praticamente copre le opzioni.

Quello che hai è il più vicino possibile, credo.

Per curiosità, quale sarebbe la tua ragione per voler limitare l'interfaccia a T?

O vuoi dire può un vincolo anche essere messo in T per T-implementare specifica interfaccia alcuni ?

Se è così, allora si : semplicemente hanno due where clausole (ad esempio, where S : T where T : U).

+0

Oh, stavo per questo: Lista public static interfacelist = new List ; vuoto statico pubblico Aggiungi (ingresso S); E sì, funzionerà anche se T è solo una classe base ma il client dovrebbe ottenere interfacce, non classi base. –

3
where T: IMyOtherInterfaceForT 

Esempio:

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

Si potrebbe fare qualcosa del genere per rafforzarlo in fase di esecuzione invece di compilare il tempo.

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