Casting IEnumerable avec classe personnalisée

c# casting dapper ienumerable

Question

J'ai utilisé dapper dernièrement et je voulais créer une méthode dynamique qui faciliterait la sélection de choses avec sql. Ceci est mon code:

Classe:

public class Method
{
    public static IEnumerable<dynamic> QueryAll(string table)
    { 
        dynamic dyn = table;
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DbCon"].ToString());
        using (con)
        {
            string sql = String.Format("SELECT * FROM {0}", table);
            IEnumerable<dynamic> ie = con.Query<dynamic>(sql, null);
            return ie;
        }

    }
}

Fonction d'appel ici:

IEnumerable<posts> = Method.QueryAll("posts");

Cela me donne une erreur that I cannot convert IEnumerable dynamic to IEnumerable Models.Posts .

Comment puis-je le lancer pour le faire fonctionner?

Réponse acceptée

Techniquement, vous pouvez simplement utiliser la méthode IEnumerable.Cast pour lancer chaque instance renvoyée par la méthode à l'instance réelle.

IEnumerable<posts> = Method.QueryAll("posts").Cast<posts>();

Cependant, si vous connaissez déjà le type actuel, pourquoi ne pas l'utiliser dans la requête déjà? dynamic doit être manipulé avec soin et seulement si vous devez vraiment, ce qui est le cas ici. Vous pouvez par exemple ajouter le type actuel en tant que paramètre de type à la méthode:

public static IEnumerable<T> QueryAll<T>(string table)
{ 
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DbCon"].ToString());
    using (con)
    {
        string sql = String.Format("SELECT * FROM {0}", table);
        IEnumerable<T> ie = con.Query<T>(sql, null);
        return ie;
    }
}

Maintenant, vous pouvez l'appeler comme suit:

var result = Method.QueryAll<posts>("posts");

En tant que Method part est un nom de classe vraiment mauvais, en tant que posts aussi. Vous devriez donner les noms de votre classe qui décrivent pour quoi ils servent et ce qu’ils font. De plus, il existe des conventions de nommage suggérant d’utiliser les noms de classe PascalCase pour les classes faisant votre classe Posts . Enfin, lorsque vous avez une énumération de posts , je suppose que la classe elle-même représente un seul message, pas beaucoup, donc vous voulez réellement une classe nommée Post que vous pouvez stocker dans un IEnumerable<Post> .



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