如何给字段加“标签”?

      在项目中遇到这么一个问题。需要为某些指标设置为一级指标,二级指标等。例如name这个指标是一级指标,age这个指标是二级指标,其实说白了就是给实体中的字段加上“标签”。给字段加“标签”?好像不行吧。如果是一个类的话就好办了。让这个类继承一个标识接口,然后说继承了这个接口的就是一级指标,这样就行了,那么是字段怎么办呢?首先作为一个实体类,他中的字段和数据库中是对应的,所以不能做手脚,我们可以另外声明一个类,是实体类的标识加强版就行了。不多说了,看代码吧。

      首先,先看看我的实体类。

      

 1     public class Person
 2     {
 3         public string Name { set; get; }
 4 
 5 
 6         public string Age { set; get; }
 7 
 8 
 9         public string Height { set; get; }
10 
11 
12         public string Weight { set; get; }
13     }
View Code

     下面定义我的实体类的标识加强版

 1  public class Person_Level:Entity
 2     {
 3         public string Name1 { set; get; }
 4 
 5 
 6         public string Age2 { set; get; }
 7 
 8         public string Height1 { set; get; }
 9 
10 
11         public string Weight2 { set; get; }
12     }
View Code

    为什么要这么定义呢,加强版的字段很有特点,前面是是实体中的字段,后面是1或2,表示是一级字段或二级字段。下面我们要做的就是把实体中的数据传输到实体类的标识加强版就行了。那么现在我们的主角登场了-------反射。写一个方法,将实体中的数据传递到加强版中。

 

 private Person_Level translate(Person p,Person_Level level){
           PropertyInfo[] p_property= p.GetType().GetProperties();
           PropertyInfo[] level_property = level.GetType().GetProperties();

           for (int i = 0; i < p_property.Length; i++) { //原来的
               for (int j = 0; j < level_property.Length; j++) { //要使用的
                   if (level_property[j].Name.Contains(p_property[i].Name)) {

                       level_property[j].SetValue(level, (string)p_property[i].GetValue(p));
                   }
               }
           }
               return level;
               
        }
View Code

最后验证一下,能不能传递过去。

   [Test]
        public void translateTest1()
        {
            Person p = new Person();
            p.Age = "12";
            p.Name = "linyang";
            p.Weight = "75斤";
            p.Height = "186";
            Person_Level level = translate(p, new Person_Level());
            Console.WriteLine(level.Weight2);
            Console.WriteLine(level.Height1);
            Console.WriteLine(level.Age2);
            Console.WriteLine(level.Name1);
        }
View Code

显示的结果为:

75斤
186
12
linyang

实践证明获取到值了,也就实现了给实体加标示并且数据不改变的目的。

 

ps:本人今天才开园,是新手。仅仅是为了记录一下项目的心得体会,也是交流经验,但是写的功力有限,望请见谅

 

posted @ 2014-09-08 21:56  先知后觉  阅读(1094)  评论(0编辑  收藏  举报