如何避免重复代码?

我还是很喜欢编程,我注意到我正在重复代码:

protected void FillTradeSetups() { DBUtil DB = new DBUtil(); DataTable dtTradeSetups; dtTradeSetups = DB.GetTradeSetups(); ddlSetups.DataValueField = "tradeSetupId"; ddlSetups.DataSource = dtTradeSetups; ddlSetups.DataBind(); } protected void FillTimeFrames() { DBUtil DB = new DBUtil(); DataTable dtTimeFrames; dtTimeFrames = DB.GetTimeFrames(); ddlTimeFrames.DataValueField = "tfCode"; ddlTimeFrames.DataSource = dtTimeFrames; ddlTimeFrames.DataBind(); } protected void FillTradeGrades() { DBUtil DB = new DBUtil(); DataTable dtTradeGrades; dtTradeGrades = DB.GetTradeGrades(); ddlTradeGrades.DataValueField = "tradeGrade"; ddlTradeGrades.DataTextField = "descr"; ddlTradeGrades.DataSource = dtTradeGrades; ddlTradeGrades.DataBind(); } protected void FillExecutionGrades() { DBUtil DB = new DBUtil(); DataTable dtExecutionGrades; dtExecutionGrades = DB.GetExecutionGrades(); ddlExecutionGrades.DataValueField = "executionGrade"; ddlExecutionGrades.DataTextField = "descr"; ddlExecutionGrades.DataSource = dtExecutionGrades; ddlExecutionGrades.DataBind(); } 

我怎么能更聪明一点呢? 你能帮我重新编写代码,这样就不会重复了吗?

UPDATE

哇,谢谢你的回复,我想我会发布我正在考虑实施的内容。 我还创建了另一个小工作者来删除其他一些丑陋的重复代码。 你觉得这怎么样?

 void FillDropDownList(DropDownList ddl, DataTable dt, string dataValueField, string dataTextField, string defValue) { ddl.DataValueField = dataValueField; ddl.DataSource = dt; if (!string.IsNullOrEmpty(dataTextField)) { ddl.DataTextField = dataTextField; } ddl.DataBind(); ddl.SelectedValue = defValue; } private string GetTradeItem(DataTable tradeDetails, string attribute) { return tradeDetails.Rows[0][attribute].ToString(); } 

然后用类似的东西来调用它:

 int tradeId = int.Parse(Request.QueryString["tradeId"]); DBUtil DB = new DBUtil(); DataTable tradeDetails = DB.GetTrade(tradeId); FillDropDownList(ddlTradeGrades, DB.GetTradeGrades(), "tradeGrade", "descr", GetTradeItem(tradeDetails, "tradeGrade")); 

当丑陋变成更优雅的东西时,编码感觉很棒。

也许这样的事情?

 void SetupDataSource(DropDownList ddl, DataTable dt, string dataValueFieldm, string dataTextField) { if (ddl != null) { ddl.DataValueField = dataValueField; ddl.DataSource = dt; if (!string.IsNullOrEmpty(dataTextField)) { ddl.DataTextField = dataTextField; } ddl.DataBind(); } else { throw new ArgumentNullException("ddl"); } } 

FWIW,也许是这样的:

 void BindControl(DropDownList ddl, string valueField, string textField, DataTable data) { ddl.DataValueField = valueField; ddl.DataTextField = textField ?? valueField; // textField can be null ddl.DataSource = data; ddl.DataBind(); } DBUtil DB = new DBUtil(); BindControl(ddlTradeGrades, "tradeGrade", "descr", DB.GetTradeGrades()); ... 

但是,管道本身并不是非常重复,应该考虑将来修改/维护的容易程度。

快乐的编码。

怎么样的:

 void FillData(DataTable dataSource, DropDownList ddl, string dataValueField, string dataTextField) { ddl.DataSource = dt; ddl.DataValueField = dataValueField; ddl.DataTextField = dataTextField; ddl.DataBind(); } 

然后你可以这样称呼它:

 FillData(DB.GetTradeSetups(), ddlSetups, "tradeSetupId", string.Empty) 

创建一个设置所需内容的方法:

 void SetValues(DropDownList ddl, string datavalue, string text, object ds) { ddl.DataValueField = dataValue; ddl.DataTextField = text; ddl.DataSource = ds; ddl.DataBind(); } 

然后你可以用:

 SetValues(ddlTradeGrades, "tradeGrade", "descr", dtTradeGrades); 

你可以这样做:

  private void BindMyLists() { DBUtil DB = new DBUtil(); BindDropDownList(this.ddlExecutionGrades, DB.GetExecutionGrades(), "executionGrade", "descr"); BindDropDownList(this.ddlTradeGrades, DB.GetTradeGrades(), "tradeGrade", "descr"); //etc } protected void BindDropDownList(DropDownList dropDownList, DataTable dataTable, string dataValueField, string dataTextField) { dropDownList.DataValueField = dataValueField; dropDownList.DataTextField = dataTextField; dropDownList.DataSource = dataTable; dropDownList.DataBind(); } 

请参阅需要通用实用程序C#方法来填充ASP.NET DropDownList

可能是这样的……

 protected void FillDdl(DropDownList ddl, string dataValueField, Func dataTableMethod) { FillDdl(ddl, dataValueField, null, dataTableMethod); } protected void FillDdl(DropDownList ddl, string dataValueField, string dataTextField, Func dataTableMethod) { DataTable dt = dataTableMethod(); ddl.DataSource = dt; ddl.DataValueField = dataValueField; ddl.DataTextField = dataTextField ?? dataValueField; ddl.DataBind(); } 

然后像这样直接打电话

 DBUtil DB = new DBUtil(); FillDdl(ddlSetups, "tradeSetupId", DB.GetTradeSetups); FillDdl(ddlTimeFrames, "tfCode", DB.GetTimeFrames); FillDdl(ddlTradeGrades, "tradeGrade", "descr", DB.GetTradeGrades); FillDdl(ddlExecutionGrades, "executionGrade", "descr", DB.GetExecutionGrades); 

或者你仍然可以使用瘦小的个人方法

 protected void FillTradeSetups() { DBUtil DB = new DBUtil(); FillDdl(ddlSetups, "tradeSetupId", DB.GetTradeSetups); } protected void FillTimeFrames() { DBUtil DB = new DBUtil(); FillDdl(ddlTimeFrames, "tfCode", DB.GetTimeFrames); } protected void FillTradeGrades() { DBUtil DB = new DBUtil(); FillDdl(ddlTradeGrades, "tradeGrade", "descr", DB.GetTradeGrades); } protected void FillExecutionGrades() { DBUtil DB = new DBUtil(); FillDdl(ddlExecutionGrades, "executionGrade", "descr", DB.GetExecutionGrades); }