Geben Sie type in generic Argument bei der Verwendung von Dapper QueryMultiple ein

c# dapper generics runtime

Frage

Ich versuche, eine Ebene über dem Dapper zu erstellen, und möchte eine Methode erstellen, die die QueryMultiple-Methode verwendet. Ich möchte eine eingehende Liste von Typen im Zeichenfolgenformat (zur Laufzeit bestimmt) mit der Read-Methode von QueryMultiple abbilden. Beim Versuch, die Read-Methode zu verwenden, kann ich keine Möglichkeit finden, das generische Argument den Typ zu akzeptieren, den ich erstelle.

Kann mir bitte jemand helfen, wie man den Typ richtig bereitstellt?

Hier ist der 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
    }
}

Akzeptierte Antwort

Die Methode QueryMultiple.Read<T>() , die gerade verwendet wird, benötigt einen generischen Typparameter, der zur Kompilierungszeit bekannt sein muss. Mit anderen Worten, elementType kann nicht als generischer Typparameter innerhalb des <T> -Parameters verwendet werden:

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

Wenn der Typ bis zur Laufzeit nicht bekannt ist, verwenden Sie die Methode QueryMultiple.Read(Type type) :

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

Weitere Informationen zu generischen Typparametern finden Sie in MSDN.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum