2011-03-18 20 views
5

¿Alguien más considera que podría ser útil si el tiempo de ejecución permitiera referencias a miembros de una interfaz genérica que no fueran específicos del tipo genérico? Sé que la "solución alternativa" habitual es crear una interfaz no genérica como base para la interfaz genérica, pero ¿existe una razón válida en contra de que la interfaz básica sea básicamente automática?referencias abstractas a interfaces genéricas

Por ejemplo, dada la siguiente interfaz:

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

Creo que sería conveniente para permitir automáticamente algo como esto:

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

Tengo curiosidad por escuchar los argumentos en contra de esta (otra que "deja de ser tan vago y solo escribe la interfaz base").

+1

¿Cómo sabría a qué te refieres? –

+1

Parece que para manejar una función de este tipo, C# tendría que ser tipeado dinámicamente. –

+1

Paul Sasik. Dicho código después de la compilación puede generar una interfaz base para genéricos. Y esta es una idea, pero puede causar algunos problemas ... – Evgeny

Respuesta

7

sólo puede utilizar un método genérico:

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

Podría, pero ¿qué pasa con un contexto en el que no sé qué es T? Por ejemplo, ¿qué ocurre si quiero cargar dinámicamente (y registrar nombres) de todas las clases en un ensamblaje que implemente la interfaz IProcessor <> (puedo verificar la interfaz utilizando t.GetInterface (typeof (IProcessor <>). Name) ! = nulo)? – WuffaloWill

+0

@WuffaloWIll: puede verificar el genérico y luego usar el reflejo para llamar al método genérico (con el tipo apropiado mediante MethodInfo.MakeGenericMethod: http://msdn.microsoft.com/en-us/library/system.reflection. methodinfo.makegenericmethod.aspx). No es bonito, pero funcionará en muchos casos. Sin embargo, para las API normales en las que no está utilizando la relización, esto funciona perfectamente. –

+0

@ Reed- Gracias por la respuesta. Entiendo cómo usar métodos genéricos en "API normales"; Supongo que debería haber redactado mi respuesta original como "¿qué pasa con un contexto en el que no me importa qué es T?" – WuffaloWill

0

La razón principal por la cual no es la especificación del lenguaje común. Y agregar esas cosas es una gran parte del trabajo y las pruebas para los desarrolladores de Microsoft Framework. Así que es más fácil agregar una interfaz base. Pero de todos modos puedes publicar tu idea en microsoft forums

Cuestiones relacionadas