2009-07-09 13 views

risposta

4

C# e CLR non supportano i vincoli di interfaccia generali, sebbene sia possibile vincolarli a una particolare interfaccia (vedere altre risposte). Il più vicino che puoi ottenere è 'classe' e controllo il tipo usando la riflessione in fase di esecuzione, temo. Perché dovresti volere un vincolo di interfaccia in primo luogo?

+0

Per un'iniezione di dipendenza implementata su misura/pazza, forse. Ma questo sono io che indovino. – Felype

6

Se ti stai chiedendo di aggiungere un vincolo per una specifica interfaccia, che è semplice:

public void Register<T>(T data) where T : ISomeInterface 

Se ti stai chiedendo se una parola chiave esiste, come classe o struct per vincolare la gamma di possibili tipi di T, che Non è disponibile.

Mentre è possibile scrivere:

public void Register<T>(T data) where T : class // (or struct) 

Non si può scrivere:

public void Register<T>(T data) where T : interface 
0

Non si può pretendere che T è un'interfaccia, in modo che avrebbe dovuto utilizzare la riflessione in fase di esecuzione per affermare questo.

0

Se possibile, sono andato con una soluzione come questa. Funziona solo se vuoi che diverse interfacce specifiche (ad esempio quelle a cui hai accesso sorgente) vengano passate come parametro generico, non come alcuno.

  • Ho lasciato che le mie interfacce, che sono venute in dubbio, ereditano un'interfaccia vuota IInterface.
  • ho costretto il parametro generico T essere di IInterface

In origine, sembra che questo:

  • Qualsiasi interfaccia che si desidera essere passato come parametro generico:

    public interface IWhatever : IInterface 
    { 
        // IWhatever specific declarations 
    } 
    
  • IInterface:

    public interface IInterface 
    { 
        // Nothing in here, keep moving 
    } 
    
  • La classe su cui si desidera inserire il tipo di vincolo:

    public class WorldPieceGenerator<T> where T : IInterface 
    { 
        // Actual world piece generating code 
    } 
    
Problemi correlati