2016-11-26 14 views
3

最近私はdapperを使用していて、sqlを使って簡単に選択する動的な方法を作りたかったのです。 これは私のコードです:キャスティングIEnumerable <dynamic>カスタムクラス

クラス:ここに関数を呼び出す

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を与えます。

どのように動作させるためにキャストすることができますか?

答えて

5

技術的には、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と同じです。クラス名には、そのクラスが提供するものと何をしているのかを記述する必要があります。さらに、クラスを作るクラスのためにPascalCase -namesを使用することを示唆する命名規則があります。Posts最後にpostsの列挙があるとき、クラス自体が1つの投稿を表していると思いますので、実際にPostという名前のクラスがあり、IEnumerable<Post>に格納できます。

+0

ありがとうございました。あなたの解決策は私を明るくする、私はIEnumerable Tを使用することについて考えていない。クラス名については、この例の場合のみでしたが、ええ、私は名前の選択を少し難しくすることができます。 – Harugawa

関連する問題