繁体   English   中英

泛化对象初始化的更好方法?

[英]Better way to Generalize Object Initialization?

我有以下代码来概括许多非常相似的对象的初始化。 我已经概括了 c# 代码(如下所示)。 有人知道更好的方法吗? 这还不错,但仍然涉及一些复制/粘贴,我想避免这种情况。

private Tuple<SqlCommand, SqlCommand, SqlCommand, SqlCommand, SqlDataAdapter> initializeCommandsFor (string type) {
    SqlCommand selectCommand;
    SqlCommand insertCommand;
    SqlCommand updateCommand;
    SqlCommand deleteCommand;
    SqlDataAdapter dataAdapter;

    selectCommand = new SqlCommand("Get" + type + "Data", cntn);
    selectCommand.CommandType = CommandType.StoredProcedure;

    insertCommand = new SqlCommand("Insert" + type, cntn);
    insertCommand.CommandType = CommandType.StoredProcedure;

    updateCommand = new SqlCommand("Update" + type, cntn);
    updateCommand.CommandType = CommandType.StoredProcedure;

    deleteCommand = new SqlCommand("Delete" + type, cntn);
    deleteCommand.CommandType = CommandType.StoredProcedure;

    cntn.Open();
    SqlCommandBuilder.DeriveParameters(selectCommand);
    cntn.Close();

    dataAdapter = new SqlDataAdapter(selectCommand);
    dataAdapter.InsertCommand = insertCommand;
    dataAdapter.UpdateCommand = updateCommand;
    dataAdapter.DeleteCommand = deleteCommand;

    return Tuple.Create(selectCommand, insertCommand, updateCommand, deleteCommand, dataAdapter);
}

private void customerCommands () {
    var commands = initializeCommandsFor("Customer");
    customerSelectCommand = commands.Item1;
    customerInsertCommand = commands.Item2;
    customerUpdateCommand = commands.Item3;
    customerDeleteCommand = commands.Item4;
    customerDataAdapter = commands.Item5;
}

private void competitorCommands () {
    var commands = initializeCommandsFor("Competitor");
    competitorSelectCommand = commands.Item1;
    competitorInsertCommand = commands.Item2;
    competitorUpdateCommand = commands.Item3;
    competitorDeleteCommand = commands.Item4;
    competitorDataAdapter = commands.Item5;
}

我会创建一个这样的扩展方法:

public static class SqlDataAdapterExtension
{
    public static void InitializeCommandsFor(this SqlDataAdapter adapter, string type)
    {
        SqlCommand selectCommand;
        SqlCommand insertCommand;
        SqlCommand updateCommand;
        SqlCommand deleteCommand;
        SqlDataAdapter dataAdapter;

        adapter.SelectCommand = new SqlCommand("Get" + type + "Data", cntn);
        adapter.SelectCommand.CommandType = CommandType.StoredProcedure;

        adapter.InsertCommand = new SqlCommand("Insert" + type, cntn);
        adapter.InsertCommand.CommandType = CommandType.StoredProcedure;

        adapter.UpdateCommand = new SqlCommand("Update" + type, cntn);
        adapter.UpdateCommand.CommandType = CommandType.StoredProcedure;

        adapter.DeleteCommand = new SqlCommand("Delete" + type, cntn);
        adapter.DeleteCommand.CommandType = CommandType.StoredProcedure;

        cntn.Open();
        SqlCommandBuilder.DeriveParameters(adapter.SelectCommand);
        cntn.Close();
    }
}

然后像这样使用它:

var adapter = new SqlDataAdapter();
adapter.InitializeCommandsFor("Customer");
// Now the select, update, delete and insert commands are in your adapter

我还更改了您的方法的名称,以按照 .NET 约定使用 Camel Case 表示法。

如果您在另一个命名空间中创建扩展类,请确保通过using语句导入该命名空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM