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

4
最近我一直在使用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");

我遇到了一个错误:我无法将IEnumerable dynamic转换为IEnumerable Models.Posts

我该如何进行转换才能使其正常工作。

1个回答

6

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

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

然而,如果你已经知道实际类型,为什么不直接在查询中使用它呢?dynamic应该小心处理,只有在确实需要时才使用,我怀疑在这种情况下是否需要。例如,你可以将实际类型作为类型参数添加到方法中:

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”也是。您应该给您的类命名,以描述它们提供的服务和它们正在做什么。此外,有一些命名约定建议使用首字母大写的名称来创建类,使您的类成为“Posts”。最后,当您有一个“posts”的枚举时,我认为类本身代表一个单独的帖子,而不是多个,因此您实际上需要一个名为“Post”的类,并将其存储到“IEnumerable<Post>”中。

感谢您的简短回答。您的解决方案启发了我,我没有想到可以使用IEnumerable T。至于类名,这只是为了这个示例案例,但是是的,我可以在名称选择上再努力一点。 - Harugawa
在我的情况下,类的返回类型确实是未知的。这种情况下有什么解决方案? - Homa Pour Mohammadi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接