c#利用委托传递函数参数(1)
本次旨在解决 同参不同名 的函数作为参数传递的情况
情景:
一下两个函数分别多次重复调用了两个同参不同名的函数(实际上总共有3个这样的函数),函数结构基本相同,只有调用的函数名不一样,显然可以整合在一个函数中,减少代码量;
1 private void button1_Click(object sender, EventArgs e) 2 { 3 clsLineSeg.UpdateDiseasePostion(map, tblRouteData, "Z001522600"); 4 clsLineSeg.UpdateDiseasePostion(map, tblRouteData, "C800522635"); 5 clsLineSeg.UpdateDiseasePostion(map, tblRouteData, "X890522635"); 6 clsLineSeg.UpdateDiseasePostion(map, tblRouteData, "Y003522635"); 7 clsLineSeg.UpdateDiseasePostion(map, tblRouteData, "X899522635"); 8 clsLineSeg.UpdateDiseasePostion(map, tblRouteData, "C018522635"); 9 clsLineSeg.UpdateDiseasePostion(map, tblRouteData, "S311520000"); 10 MessageBox.Show("ok"); 11 } 12 13 private void btnUpdateAssetGps_Click(object sender, EventArgs e) 14 { 15 clsLineSeg.UpdateAssetDataGpsPostion(map, tblRouteData, "Z001522600"); 16 clsLineSeg.UpdateAssetDataGpsPostion(map, tblRouteData, "C800522635"); 17 clsLineSeg.UpdateAssetDataGpsPostion(map, tblRouteData, "X890522635"); 18 clsLineSeg.UpdateAssetDataGpsPostion(map, tblRouteData, "Y003522635"); 19 clsLineSeg.UpdateAssetDataGpsPostion(map, tblRouteData, "X899522635"); 20 clsLineSeg.UpdateAssetDataGpsPostion(map, tblRouteData, "C018522635"); 21 clsLineSeg.UpdateAssetDataGpsPostion(map, tblRouteData, "S311520000"); 22 MessageBox.Show("ok"); 23 }
方案:
但是要想完全统一,肯定需要将要调用的函数作为新函数的参数传递进去,这里就可以用到c#的委托,如下:
public delegate void UpdateMethodHandler(IMap map, ITable tblRouteData,string routeCode);//声明委托
1 //修改简化待调用函数 2 public void UpdateAssetDataGps84Postion(IMap map, ITable tblRouteData, string routeCode) 3 { 4 clsLineSeg.UpdateAssetDataGps84Postion(map, tblRouteData, routeCode); 5 } 6 7 public void UpdateDiseasePostion(IMap map, ITable tblRouteData, string routeCode) 8 { 9 clsLineSeg.UpdateDiseasePostion(map, tblRouteData, routeCode); 10 }
1 //利用委托传递函数名参数 2 public void btnUpdateClick(UpdateMethodHandler UpdateMethodHandler) 3 { 4 var routeLst = GetRouteLst(); 5 if(routeLst==null||routeLst.Length<=0) 6 { 7 MessageBox.Show("请输入路线编码!"); 8 return; 9 } 10 foreach(var r in routeLst) 11 { 12 UpdateMethodHandler(map, tblRouteData, r); 13 } 14 MessageBox.Show("ok"); 15 }
1 //函数调用简化 2 private void btnUpdateStakeTable_Click(object sender, EventArgs e) 3 { 4 btnUpdateClick(UpdateAssetDataGps84Postion); 5 //clsLineSeg.UpdateAssetDataGps84Postion(map, tblRouteData, "Z001522600"); 6 //clsLineSeg.UpdateAssetDataGps84Postion(map, tblRouteData, "C800522635"); 7 //clsLineSeg.UpdateAssetDataGps84Postion(map, tblRouteData, "X890522635"); 8 //clsLineSeg.UpdateAssetDataGps84Postion(map, tblRouteData, "Y003522635"); 9 //clsLineSeg.UpdateAssetDataGps84Postion(map, tblRouteData, "X899522635"); 10 //clsLineSeg.UpdateAssetDataGps84Postion(map, tblRouteData, "C018522635"); 11 //clsLineSeg.UpdateAssetDataGps84Postion(map, tblRouteData, "S311520000"); 12 //MessageBox.Show("ok"); 13 }