这几天回去看了下之前的项目源码,发现极为粗制滥造,CRUD成了习惯后,技术很容易停滞不前,大部分时间用在了CV上,代码复制过来就用,也不加一改动、抽象、封装下。
这里举一个小例子。
有三个业务功能,材料计划,材料申请,采购计划。都有工作流参与,需要记录每一步中材料的数量和变化。共有属性:材料名称,材料数量,材料价格,之前的做法就是直接CV几个函数,分别对应每个计划的处理。其实认真分析后,可以发现大部分属性是共有的,设计如下。(笔记本没装PDM,用EXCEL画了)
,明细表,记录每一步的原始数据,,变动表,记录每一步的数据变化,需要和上一步的对比。
1 这里先列出明细的基类和材料计划的子类
1 public class TBL_Detail 2 { 3 public TBL_Detail() 4 { 5 } 6 7 public string Id { get; set; } 8 public string CLID { get; set; } 9 public string Name { get; set; } 10 public decimal Num { get; set; } 11 public string Price{ get; set; } 12 public string Step { get; set; } 13 public string JHID { get; set; } 14 15 }
1 public class TBL_Detail_CLJH : TBL_Detail 2 { 3 public TBL_Detail_CLJH() 4 { 5 } 6 7 //可添加实际的属性 8 }
2 定义一个方法,用于将子类转换为父类。
1 public static List<TBL_Detail> getDetailFromChild<T>(List<T> list) where T : TBL_Detail 2 { 3 List<TBL_Detail> list_detail = new List<TBL_Detail>(); 4 foreach (T item in list) 5 { 6 list_detail.Add((TBL_Detail)item); 7 } 8 return list_detail; 9 }
这里泛型表示参数类型限制为 派生自明细表基类(TBL_Detail)的子类,循环中将子类装箱为父类。
调试代码:
1 static void Main(string[] args) 2 { 3 List<TBL_Detail_CLJH> list1 = new List<TBL_Detail_CLJH>(); 4 TBL_Detail_CLJH oned = new TBL_Detail_CLJH(); 5 for (int i = 0; i < 3; i++) 6 { 7 oned = new TBL_Detail_CLJH(); 8 oned.Id = "Id" + i; 9 oned.Name = "Name" + i; 10 list1.Add(oned); 11 } 12 13 List<TBL_Detail> list = getDetailFromChild(list1); 14 Console.WriteLine("类型1"); 15 Test(list); 16 Console.Read(); 17 }
3,加入TBL_Change变化表的处理,这里扩展下泛型参数的方法,让它可以支持多个泛型参数就可以了。
1 public static List<TBL_Detail> getDetailFromChild<T,U>(List<T> list, List<U> list_change) 2 where T : TBL_Detail 3 where U : TBL_Change 4 { 5 List<TBL_Detail> list_detail = new List<TBL_Detail>(); 6 foreach (T item in list) 7 { 8 list_detail.Add((TBL_Detail)item); 9 } 10 return list_detail; 11 }
如果还要加参数,在<T,U>里边继续添加即可,别忘了添加约束。