C # usa System.Type como parámetro genérico

Tengo una lista de tipos (System.Type) que necesitan ser consultados en la base de datos.

Para cada uno de estos tipos, necesito llamar al siguiente método de extensión (que es parte de LinqToNhibernate):

Session.Linq() 

Sin embargo, no tengo MyType, pero quiero usar un Type en su lugar.

Lo que tengo es:

 System.Type typeOne; 

Pero no puedo realizar lo siguiente:

 Session.Linq() 

¿Cómo puedo usar un tipo como parámetro genérico?

No puedes, directamente. El objective de los generics es proporcionar seguridad de tipo de tiempo de comstackción , donde conoce el tipo que le interesa en tiempo de comstackción y puede trabajar con instancias de ese tipo. En su caso, solo conoce el Type por lo que no puede obtener comprobaciones en tiempo de comstackción de que los objetos que tenga sean instancias de ese tipo.

Tendrá que llamar al método mediante reflexión, algo como esto:

 // Get the generic type definition MethodInfo method = typeof(Session).GetMethod("Linq", BindingFlags.Public | BindingFlags.Static); // Build a method with the specific type argument you're interested in method = method.MakeGenericMethod(typeOne); // The "null" is because it's a static method method.Invoke(null, arguments); 

Si necesita utilizar este tipo mucho, puede que le resulte más conveniente escribir su propio método genérico que llame a cualquier otro método genérico que necesite, y luego llamar a su método con reflexión.

Para hacer esto necesitas usar la reflexión:

 typeof(Session).GetMethod("Linq").MakeGenericMethod(typeOne).Invoke(null, null); 

(suponiendo que Linq() es un método estático en el tipo Session )

Si Session es realmente un objeto , necesitará saber dónde se declara realmente el método Linq y pasarlo en la Session como argumento:

 typeof(DeclaringType).GetMethod("Linq").MakeGenericMethod(typeOne) .Invoke(null, new object[] {Session});