2010-01-20 16 views
15

tengo un método FindAll en mi DataAccessLayer que se parece a esto:¿Puedo pasar un tipo de objeto a un método genérico?

public FindResult<T> FindAll<T>() where T : Entity, new() 

y un código de cliente que tiene una matriz de tipo [] que se tiene que usar para llamar iterativamente el método FindAll con este aspecto:

foreach (var type in typeArray) 
{  
    var result = DataAccessLayer.FindAll<type>(); 
    ... 

pero las quejas del compilador sobre "Tipo o espacio de nombre esperado" ... ¿Hay una manera fácil de evitar esto? He intentado type.GetType() o typeof (type) y ninguno funcionó.

¡Muchas gracias de antemano!

Respuesta

13

Puede que tenga que utilizar la reflexión para hacer esto, algo como esto:

DataAccessLayer.GetType().GetMethod("FindAll<>").MakeGenericMethod(type).Invoke() 

This blog post también pueden contener la información que necesita.

+0

¿Es porque C# no admite el tipado dinámico (escuché que es compatible con C# 4.0) que mi código original no funcionaba? – theburningmonk

+1

No estoy seguro de si el soporte dinámico en C# 4 te permitiría hacer esto de otra manera, ya que tampoco sé cómo podrías proporcionar el tipo genérico dinámico. Pero no lo he intentado ... – Lucero

3

Al usar genéricos, el tipo debe poder resolverse en tiempo de compilación. Está intentando proporcionar el tipo en tiempo de ejecución.

+0

Sí, me di cuenta de que ahora intentaba usar el tipado dinámico que no es compatible en este momento, pero leyendo en .Net 4.0, C# va a presentar soporte para el tipado dinámico, de modo ¡quizás lo que estaba tratando de hacer será posible en el futuro cercano! – theburningmonk

Cuestiones relacionadas