IEnumerableのキャストカスタムクラスで

c# casting dapper ienumerable

質問

私は最近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というエラーが表示されます。

どのように私はそれを動作させるためにキャストすることができます。

受け入れられた回答

技術的には、 IEnumerable.Castメソッドを使用して、メソッドから返されたすべてのインスタンスを実際のインスタンスにキャストできます。

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

しかし、あなたがすでに実際のタイプを知っているのであれば、なぜそれをallreadyの中で使ってみませんか? 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も。クラス名には、そのクラスが提供するものと何をしているのかを記述する必要があります。さらに、 PascalCaseという名前を使用してクラスのPosts作成するための命名規則があります。最後にposts列挙があるとき、クラス自体が1つの投稿を表していると思いますので、実際にはPostという名前のクラスをIEnumerable<Post>格納できます。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ