动态选择要在函数中使用的类

时间:2014-09-23 03:57:13

标签: c# class

有没有办法根据函数的调用方式选择在函数中使用哪个类?代码示例最好地解释了我的问题:

我有2个单独的文件来处理每种类型的数据库(SQL,Access)

访问:

    public static DataTable Select(string connString, string query, Dictionary<string, object> Parameters = null)
    {

        DataTable dt = new DataTable();

        //Create Query
        using (OleDbConnection conn = new OleDbConnection(connString))
        using (OleDbCommand cmd = new OleDbCommand(query, conn))
        using (OleDbDataAdapter da = new OleDbDataAdapter(cmd))
        {

            //Add Parameters
            if (Parameters != null)
            {
                foreach (KeyValuePair<string, object> kvp in Parameters)
                {
                    cmd.Parameters.AddWithValue(kvp.Key, kvp.Value);
                }
            }

            //Execute Query
            conn.Open();
            da.Fill(dt);
            return dt;
        }
    }

SQL:

    public static DataTable Select(string connString, string query, Dictionary<string, object> Parameters = null)
    {

        DataTable dt = new DataTable();

        //Create Query
        using (SqlConnection conn = new SqlConnection(connString))
        using (SqlCommand cmd = new SqlCommand(query, conn))
        using (SqlDataAdapter da = new SqlDataAdapter(cmd))
        {

            //Add Parameters
            if (Parameters != null)
            {
                foreach (KeyValuePair<string, object> kvp in Parameters)
                {
                    cmd.Parameters.AddWithValue(kvp.Key, kvp.Value);
                }
            }

            //Execute Query
            conn.Open();
            da.Fill(dt);
            return dt;
        }
    }

请注意,唯一的区别是Connection,Command和Adapter的类型。

有没有办法合并这两个函数,所以我可以传递一个参数来指定使用哪种类型?

3 个答案:

答案 0 :(得分:2)

您所要求的称为Double Dispatch。你不需要双重派遣。

public static DataTable Select(DbProviderFactory factory, string connString, string query, Dictionary<string, object> Parameters = null)
{

    DataTable dt = new DataTable();

    //Create Query
    using (DbConnection conn = factory.CreateConnection())
    {
        conn.ConnectionString = connectionString;
        using(DbCommand cmd = conn.CreateCommand())
        using(DbDataAdapter da = factory.CreateDataAdapter())
        {
             cmd.CommandText = query;
             da.SelectCommand = cmd;
             if (Parameters != null)
             {
                 foreach (KeyValuePair<string, object> kvp in Parameters)
                 {
                     DbParameter parameter = cmd.createParameter();
                     parameter.ParameterName = kvp.Key;
                     parameter.Value = kvp.Value;
                     cmd.Parameters.Add(parameter);
                 }
             }
             conn.Open();
             da.Fill(dt);
             return dt;
        }
    }        
}

答案 1 :(得分:0)

要回答您的问题,您可以创建数据库类型的枚举,将其传递到Select,然后在Select内,您可以switch对值进行处理,其中每个案例包含相应的代码。

(但是,这对我来说看起来很糟糕,因为这看起来像是一个使用多态的好机会,至少其中一些你应该已经通过ADO.NET。你可以自己填补空白。)

答案 2 :(得分:0)

您可能需要查看DbProviderFactory方法

http://msdn.microsoft.com/en-us/library/wda6c36e(v=vs.110).aspx