Proporcionar tipo de argumento genérico cuando se utiliza Dapper QueryMultiple

c# dapper generics runtime

Pregunta

Intento crear una capa sobre un atlas y quiero crear un método que use el método QueryMultiple. Quiero mapear una lista entrante de tipos en formato de cadena (determinada en tiempo de ejecución) con el método de lectura de QueryMultiple. Al intentar usar el método de lectura, no puedo encontrar la forma de que el argumento genérico acepte el tipo que estoy creando.

¿Puede alguien ayudarme en cómo proporcionar correctamente el tipo?

Aquí está el código:

using (SqlConnection conn = GetNewConnection())
{
    conn.Open();
    var multi = conn.QueryMultiple(sql, param);
    foreach (string typeName in ListOfTypes)  //Iterate a List of types in string format.
    {
        Type elementType=  Type.GetType(typeName);
        var res= multi.Read<elementType>();  //Error: The type or namespace name 'combinedType' could not be found (are you missing a using directive or an assembly reference?)
        //Add result to a dictionary
    }
}

Respuesta aceptada

El QueryMultiple.Read<T>() que se utiliza actualmente toma un parámetro de tipo genérico que debe conocerse en tiempo de compilación. En otras palabras, elementType no se puede usar como un parámetro de tipo genérico dentro del parámetro <T> :

Type elementType = Type.GetType(typeName);
var res = multi.Read<elementType>(); // /Error: The type or namespace... etc.

Si el tipo no se conoce hasta el tiempo de ejecución, use el QueryMultiple.Read(Type type) :

Type elementType = Type.GetType(typeName);
var res = multi.Read(elementType); 

Consulte MSDN para obtener más información sobre los parámetros de tipo genérico .



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué