C#中PropertyInfo的用法

敲代码遇到一个问题,因为之前瞧的机房系统的组合查询功能有许多的数据需要赋值给实体,如果一个一个赋值,这样会导致产生许多相似的代码,就会不符合封装的要求,所以到网上查找之后,找到propertyinfo。

属性定义:它提供灵活的机制来读取、编写或计算某个私有字段的值。 可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。 这使得可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。属性通常可以分为常规属性和自动属性。两者之间还是有一点区别的,最开始编程对着两个全无概念。

常规属性

说起常规属性,大家应该很舒心,因为我们用Windows窗体应用的时候基本上都是使用自动属性,看下常规属性的完成构成:
1.私有字段,一般设置为私有,通过属性来赋值保证起安全性:

1 private string _age;

2.get访问器,负责读取数据,其中可以进行自己的逻辑判断和数据验证,以return或者throw结束:

1 get
2  {
3      //年龄返回值判断
4      return _age> 0 ? _age: 0;
5  }

3.set访问器,负责给属性赋值,类似于一个返回类型为void的方法,可以包含逻辑处理,例如可以根据默认的值通过计算后返回结果。

自动属性

上面简单的说了一下常规属性,当属性访问器中不需要其他逻辑时,可以使用自动属性,不过需要注意一点的就是声明自动属性时,编译器将创建一个私有的匿名后备字段,该字段只能通过属性的 get 和 set 访问器进行访问。这就是我们一般建立一个实体的时候给实体添加的属性。
public int Id { get; set; }
自动属性没有太多可以可以说的东西,简单的对比一下常规属性和自动属性之间的区别吧:

    1.自动实现的属性必须同时声明 get 和 set 访问器。创建 readonly 自动实现属性时,需要将set 访问器设置为private 。

    2.自动实现的属性 (Property) 不允许具有属性 (Attribute)。如果必须在属性 (Property) 的后备字段上使用属性 (Attribute),则应该只创建常规属性 (Property)。
    3.自动实现属性get,和set中不能包含特殊的逻辑处理。与字段类似,但不同于字段。与字段不同,属性不作为变量来分类,不能将属性作为 ref参数或 out参数传递
    上面大概简单的说了一下属性和自动属性之间的区别,现在可以回归到文中最开始的时候的那个问题:

1.案例1,如果两个类中有大部分的字段相同,需要将其中一个类的字段赋值给另外一个类:

定义Person类:

属性PropertyInfo的使用

 1 public class Person {
 2        public Person(int id,string name,string address)
 3        {
 4            this.Id = id;
 5            this.Name = name;
 6            this.Address = address;
 7        }
 8        public int Id { get; set; }
 9        public string Name { get; set; }
10        public string Address { get; set; }
11    }

定义User类

public class User {
       public int Id { get; set; }
       public string Name { get; set; }
       public string Group { get; set; }
   }

转换方法(当两个类有很多字段都是一样的话,你又不想一个一个去赋值,可以使用下面这个方法):

复制代码


1 public static User ConvertObject(User user,Person person)
 2        {
 3            PropertyInfo[] userPro = user.GetType().GetProperties();
 4            PropertyInfo[] personPro = person.GetType().GetProperties();
 5            if (userPro.Length>0&&personPro.Length>0)
 6            {
 7                for (int i = 0; i < userPro.Length; i++)
 8                {
 9                    for (int j = 0; j < personPro.Length; j++)
10                    {              
11                         //判断User的属性是不是的Person中
12                        if (userPro[i].Name == personPro[j].Name && userPro[i].PropertyType == personPro[j].PropertyType)
13                        {
14                            Object value=personPro[j].GetValue(person, null);
15                           //将Person中属性的值赋值给User                  userPro[i].SetValue(user,value , null);
16                        }
17                    }
18                }
19            }
20            return user;
21        } 


方法的调用:

1 static void Main(string[] args)
2       {
3           Person person = new Person(1,"Jerry","北京");
4           User user = new User();
5           user.Id = 20;
6           user = ConvertObject(user, person);
7           Console.WriteLine("Id:" + user.Id + "Name:" + user.Name + "角色:" + user.Group);
8           System.Console.Read();
9       }
发布了64 篇原创文章 · 获赞 15 · 访问量 7254

猜你喜欢

转载自blog.csdn.net/weixin_42263618/article/details/103747677