Fournir un type dans l'argument générique lors de l'utilisation de Dapper QueryMultiple

c# dapper generics runtime

Question

J'essaie de créer un calque sur dapper et de créer une méthode utilisant la méthode QueryMultiple. Je souhaite mapper une liste entrante de types au format chaîne (déterminée à l'exécution) avec la méthode Read de QueryMultiple. Lorsque vous essayez d'utiliser la méthode Read, je ne trouve pas de moyen pour que l'argument générique accepte le type que je crée.

Quelqu'un peut-il m'aider s'il vous plaît sur la façon de fournir correctement le type?

Voici le code:

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
    }
}

Réponse acceptée

La QueryMultiple.Read<T>() actuellement utilisée prend un paramètre de type générique qui doit être connu à la compilation. En d'autres termes, elementType ne peut pas être utilisé comme paramètre de type générique dans le paramètre <T> :

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

Si le type n'est pas connu avant l'exécution, utilisez la QueryMultiple.Read(Type type) :

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

Voir MSDN pour plus d'informations sur les paramètres de type génériques .




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi