使用自定义类转换IEnumerable <dynamic>

时间:2016-11-26 17:24:02

标签: c# casting ienumerable dapper

我最近一直在使用dapper,并希望制作一个动态方法,以便更容易用sql选择。 这是我的代码:

类别:

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

    }
}

在这里调用函数:

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

它给我一个错误that I cannot convert IEnumerable dynamic to IEnumerable Models.Posts

如何施展它以使其发挥作用。

1 个答案:

答案 0 :(得分:5)

从技术上讲,您可以使用IEnumerable.Cast - 方法将从方法返回的每个实例强制转换为实际实例。

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

但是,如果您已经知道实际类型,为什么不在查询中使用它? dynamic应该谨慎处理,并且只有你真的必须这样做,我怀疑是这样的。例如,您可以将实际类型作为type-parameter添加到方法中:

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

现在你可以按如下方式调用它:

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

旁边Method是一个非常糟糕的类名,也是posts。您应该提供您的班级名称,以描述他们所服务的内容以及他们正在做的事情。此外,还有一些命名惯例建议使用PascalCase - 用于制作课程Posts的课程的名称。最后当你有一个posts的枚举时,我想这个类本身代表一个帖子,而不是很多,所以你实际上想要一个名为Post的类,你可以将它存储到IEnumerable<Post>