将可以是两种不同类型的对象传递给c#中的函数

时间:2014-11-11 20:15:25

标签: c#

我希望有一个接收sqlDataAdapter或常规oleDataAdapter的函数,因为对象参数让我们称之为dbAdapter。然后,我想使用dbAdapter访问与传递给函数的数据适配器相关联的行。这可能吗?我想避免传递一个参数来告诉使用哪个参数,然后为每个case添加一个if语句,其中包含一组几乎相同的代码。因此,假设,函数将类似于:

private void LoadRow(object dbAdapter, int theRow)
  {
     txtID.Text = dbAdapter.Rows[theRow]["ID"].ToString();

  }

并且调用看起来像:

LoadRow(sqlDbAdapter, 1);

LoadRow(oleDbAdapter, 1);

其中sqlDbAdapter声明为SqlDataAdapter,oleDbAdapter声明为OleDataAdapter。

我想我可以向函数传递一个值,指示使用哪一个,然后使用if语句创建哪个数据适配器用于相同的变量名....如:

if (adapterType = "sql")
  {
     SqlDataAdapter dbAdapter = new SqlDataAdapter;
  }
else
  {
     OleDataAdapter dbAdapter = new OleDataAdapter;
  }

我认为每个适配器类型的所有命令和其他参数都是相同的....但是如果可能的话,我想通过引用传递对象......

请告诉我你的想法和建议......

谢谢!

瓦尔哈拉

3 个答案:

答案 0 :(得分:1)

如果您 这样做,我会使用扩展方法:

public static string LoadRow(this SqlDataAdapter adapter, int theRow)
{
    //return something you need
}

public static string LoadRow(this OleDataAdapter adapter, int theRow)
{
    //return something you need
}

用法如下:

myOleDataAdapter.LoadRow(9);
mySqlDataAdapter.LoadRow(5;

编辑 - 要回答批​​评者的意见,如果IDbDataAdapter中包含您需要的所有内容,则可以执行此操作,因为您尝试使用的两个适配器都会实现它。 / p>

public static string LoadRow(this IDbDataAdapter adapter, int theRow)
{
    //return something you need
}

答案 1 :(得分:0)

解决方案是:

private void LoadRow(DbDataAdapter dbAdapter, int theRow){
    DataSet dataSet = new DataSet();
    dbAdapter.Fill(dataSet);
    txtID.Text = dataSet.Tables["myTable"].Rows[theRow]["ID"].ToString();
}

小心使用,因为如果在大型数据集上多次使用.Fill()方法,可能会导致速度变慢。 我的建议是只填充一次数据集并尽可能多地使用它然后释放它,或者如果它不会变得太大,请将其保存在内存中并在您认为它是适当的时候刷新它。

答案 2 :(得分:-3)

一个简单的选择是重载方法,只需创建两次,对象是SqlDataAdapter,另一次是OleDataAdapter。