Estoy escribiendo una función de filtro para devolver el tipo específico especificado de una colección más grande de supertipos (objetos, por ejemplo). La idea es que te dé un enumerable y me devuelvas todos los hilos, por ejemplo. se puede escribir de esta manera sin genéricos:¿Cuál es la forma adecuada de escribir con fuerza el retorno de una función genérica?
public static IEnumerable Filter(IEnumerable source, Type type)
{
List<object> results = new List<object>();
foreach(object o in source)
{
if(o != null && o.GetType() == type)
{
results.Add(o);
}
}
return results;
}
si queremos volver genéricos hay algunas maneras diferentes de ir sobre él.
Como puerto recta:
public static IEnumerable<TResult> Filter<TResult>
(IEnumerable source, Type type)
Pass en un 'ejemplo':
IEnumerable<TResult> Filter<TResult>
(IEnumerable source, TResult resultType)
En última instancia lo que creo que es más limpio:
public static IEnumerable<T> Filter<T>(IEnumerable source)
El segundo tipo se llama completamente con parámetros (e inferir el tipo):
Filter(myList, "exampleString");
en tanto que la versión final no se obtendría llamada con un especificador de tipo:
Filter<string>(myList);
¿Cuál es la forma apropiada de escribir fuertemente el retorno de una función genérica, donde el tipo de retorno no se implica de forma automática en la firma? (¿Por qué?)
(Editar Nota: Nuestra entrada no se escribe, por ejemplo, IEnumerable <T> En el mejor sería IEnumerable Esta función devuelve el Ts de toda la colección de otros tipos...)
Así que la forma '.net' parece estar especificando el tipo, es bueno saber, gracias. Lamentablemente, estamos en un mundo 2.0 y tenemos suerte de tener genéricos. –
Sí, entiendo, estuvimos estancados con 2.0 por bastante tiempo aquí también. Supongo que lo más cerca que podrías llegar es .Net es tu última solución. Lo único que falta sería el método de extensión. – Coincoin
Marqué esto como aceptado a causa de la fuente citada, buen pensamiento. –