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

本文关键字:函数 选择 动态 | 更新日期: 2023-09-27 18:23:56

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

我有两个单独的文件来处理每种类型的数据库(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的类型。

有没有办法合并这两个函数,这样我就可以传递一个参数来指定要使用的类型?

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

您所要求的是双重调度。你不需要双重调度。

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

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

(然而,在我看来,这是一个糟糕的设计,因为这看起来是一个使用多态性的好机会,至少其中一些多态性你应该已经通过ADO.NET完成了。你可以自己填补空白。)

您可能需要研究DbProviderFactory方法

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