voglio ottenere qualcosa di simile in C# 3.5:Come inserire un vincolo di interfaccia su un metodo generico in C# 3.5?
public void Register<T>() : where T : interface {}
posso farlo con la classe o struct, ma come farlo con un'interfaccia?
voglio ottenere qualcosa di simile in C# 3.5:Come inserire un vincolo di interfaccia su un metodo generico in C# 3.5?
public void Register<T>() : where T : interface {}
posso farlo con la classe o struct, ma come farlo con un'interfaccia?
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?
Per un'iniezione di dipendenza implementata su misura/pazza, forse. Ma questo sono io che indovino. – Felype
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
Non si può pretendere che T è un'interfaccia, in modo che avrebbe dovuto utilizzare la riflessione in fase di esecuzione per affermare questo.
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.
IInterface
.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
}
duplicati di http://stackoverflow.com/questions/1096568/how-can-i-use-interface- as-ac-generic-type-constraint –