【发布时间】:2012-09-09 19:24:15
【问题描述】:
我有一个 DB 类,可以进行如下所有 DB 调用:
public delegate void Part1_Callback(string message);
public delegate void Part2_Callback(DataTable dt);
public delegate void Part3_Callback(DataTable dt, int x, int y);
public delegate void ErrorHandler(string message);
public class CommandAndCallback<TCallback>
{
public SqlCommand Sql { get; set; }
public TCallback Callback { get; set; }
public ErrorHandler Error { get; set; }
}
class DB : SingletonBase<DB>
{
public static readonly string SqlConnectionString = @"Data Source=MyDB;Initial Catalog=Stats;Integrated Security=True;Asynchronous Processing=true;";
private DB()
{
}
public void Part2(Part2_Callback callback, ErrorHandler error)
{
SqlConnection conn = new SqlConnection(SqlConnectionString);
SqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Part2";
try
{
conn.Open();
}
catch (Exception ex)
{
error(ex.ToString());
return;
}
CommandAndCallback<Part2_Callback> ar = new CommandAndCallback<Part2_Callback>() { Callback = callback, Error = error, Sql = cmd };
IAsyncResult result = cmd.BeginExecuteReader(new AsyncCallback(Part2_Handler), ar, CommandBehavior.CloseConnection);
}
private void Part2_Handler(IAsyncResult result)
{
DataTable dt = new DataTable();
CommandAndCallback<Part2_Callback> ar = (CommandAndCallback<Part2_Callback>)result.AsyncState;
SqlDataReader dr;
if (result.IsCompleted)
{
dr = ar.Sql.EndExecuteReader(result);
}
else
dr = null;
dt.Load(dr);
dr.Close();
dt.Columns[3].ReadOnly = false;
ar.Callback(dt);
}
}
在我的主课中,我是这样使用它的:
private void Form1_Enter(object sender, EventArgs e)
{
showStatus("Loading");
DB.Instance.Part2(Part2_OK, ErrorHandler);
}
private void ErrorHandler(string msg)
{
hideStatus();
viewStack1.InvokeIfRequired(c => { c.moveToFirst(); });
//MessageBox.Show(msg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
private void Part2_OK(DataTable dt)
{
dataGridView1.InvokeIfRequired(c =>
{
c.DataSource = dt;
});
}
现在我的 DB 类中有 3 个方法,它们返回 3 组不同的数据,对于每种类型,我必须声明委托。
如果将来我要添加更多方法,那么我将不得不添加更多委托。
我可以删除委托的使用吗?我想简化我的类的构建,以便轻松添加新方法。
我需要的是能够像这样调用我的 DB 类:
DB.Instance.PartX(PartX_OK, ErrorHandler);
PartX 声明如下
private void PartX_OK(DataTable dt, int x, int y, ...)
{
//logic here
}
Action<T> 可以习惯这个,所以我可以用多个参数调用我的处理程序吗?如果是那怎么办?
【问题讨论】:
-
您是说希望能够使用与
Part2_Callback和Part3_Callback的值相同的方法处理程序吗? -
在主类中,我的 DB 类中的每个方法都有不同的处理程序。但是现在我必须为每个方法定义委托(如果它需要不同类型的参数或不同数量的参数),我想摆脱它。这样我就可以有一个通用委托或 2 个委托(一个用于一个参数,第二个用于两个参数)。正如我提到的,我想尝试使用
Action<T>,但我不知道如何 -
好的。在我看来,@JustinHarvey 有你想要的东西。