在实际业务中用一个简单泛型,以及父子类的转换

这几天回去看了下之前的项目源码,发现极为粗制滥造,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     }
View Code
1 public class TBL_Detail_CLJH : TBL_Detail
2     {
3         public TBL_Detail_CLJH()
4         {
5         }
6 
7         //可添加实际的属性
8     }
View Code

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         }
View Code

这里泛型表示参数类型限制为 派生自明细表基类(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         }
View Code

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         }
View Code

如果还要加参数,在<T,U>里边继续添加即可,别忘了添加约束。

原文地址:https://www.cnblogs.com/cad2/p/10208697.html