2011-03-18 18 views
5

Qualcun altro ritengono che potrebbe essere utile se il runtime consentito riferimenti a membri di un'interfaccia generica che non erano specifiche per il tipo generico? So che la solita "soluzione alternativa" è quella di creare un'interfaccia non generica come base per l'interfaccia generica, ma esiste una valida ragione per cui l'interfaccia di base è fondamentalmente automatica?riferimenti astratti alle interfacce generiche

Ad esempio, dato il seguente interfaccia:

public interface IProcessor<T> 
{ 
    string Name { get; } 
    void Process(T item); 
} 

penso che sarebbe conveniente per consentire automaticamente qualcosa di simile:

public void LogProcessor(IProcessor<> item) 
{ 
     Trace.WriteLine(item.Name); 
} 

Sono curioso di sentire argomenti contro questa (altra di "smettere di essere così pigro e basta scrivere l'interfaccia di base").

+1

Come saprebbe cosa intendi? –

+1

Sembra che per gestire tale caratteristica C# debba essere digitato dinamicamente. –

+1

Paul Sasik. Tale codice dopo la compilazione può generare un'interfaccia di base per i generici. E questa è un'idea, ma può causare alcuni problemi ... – Evgeny

risposta

7

si può semplicemente utilizzare un metodo generico:

public void LogProcessor<T>(IProcessor<T> item) 
{ 
    Trace.WriteLine(item.Name); 
} 
+0

Potrei, ma per quanto riguarda un contesto in cui non so cosa sia T? Per esempio, che se voglio caricare dinamicamente (e registrare i nomi) di tutte le classi in un assembly che implementano l'interfaccia IProcessor <> (posso controllare per l'interfaccia utilizzando t.GetInterface (typeof (IProcessor <>). Nome) ! = null)? – WuffaloWill

+0

@WuffaloWIll: è possibile verificare quello generico, quindi utilizzare reflection per chiamare il metodo generico (con il tipo appropriato tramite MethodInfo.MakeGenericMethod: http://msdn.microsoft.com/en-us/library/system.reflection. methodinfo.makegenericmethod.aspx). Non è bello, ma funzionerà in molti casi. Tuttavia, per le normali API in cui non stai utilizzando la refezione, funziona perfettamente. –

+0

@ Reed- Grazie per la risposta. Capisco come usare i metodi generici in "normali API"; Suppongo che avrei dovuto formulare la mia risposta originale come "che dire di un contesto in cui non _care_ cosa T è?" – WuffaloWill

0

Il motivo principale per cui non è specifica del linguaggio comune. E aggiungere cose del genere è una grande parte del lavoro e dei test per gli sviluppatori di microsoft framework. Quindi è più facile aggiungere l'interfaccia di base. Ma ad ogni modo puoi farti un'idea sui forum Microsoft

Problemi correlati