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 }
C#中PropertyInfo的用法相关推荐
- mysql中change用法,mysql 中alter的用法以及一些步骤
mysql 中alter的用法以及一些方法 在用到alter的时间,查到了这个文章,就copy下来了,详细进入下面链接: MySQL之alter语句用法总结 1:删除列 ALTER TABLE [表名 ...
- mysql中正则表达式的用法_Mysql中正则表达式Regexp常见用法
Mysql中Regexp常见用法 模糊匹配,包含特定字符串 # 查找content字段中包含"车友俱乐部"的记录 select * from club_content where ...
- 【C++】C/C++ 中 static 的用法全局变量与局部变量
C/C++ 中 static 的用法全局变量与局部变量 目录 1. 什么是static? 1.1 static 的引入 1.2 静态数据的存储 2. 在 C/C++ 中static的作用 2.1 总的 ...
- php foreach嵌套foreach,php中foreach怎么嵌套foreach PHP中foreach函数用法?
foreach的使用方法小编不是很明确,分享达人指教一下.foreach (array_expressforeach($array as $key) { if(xxxx) { break; //bre ...
- python中str的index什么意思_python中index的用法是什么
index() 一般用处是在序列中检索参数并返回第一次出现的索引,没找到就会报错,比如:>>> t=tuple('Allen') >>> t ('A', 'l', ...
- php foreach是什么,php中foreach的用法是什么
php中foreach的用法是:[foreach ($array as $value) {要执行代码;}],每进行一次循环,当前数组元素的值就会被赋值给$value变量,在进行下一次循环时,将得到数组 ...
- java中的基本用法
java中的基本用法 关键字:专门用途的字符串 所有java关键字都是小写英文 标识符 java常量 java变量 ■ 作用域:起作用的区域■ 使用前必须先声明,在赋值.使用变量名访问这块区域 jav ...
- Java中getResourceAsStream的用法
Java中getResourceAsStream的用法 首先,Java中的getResourceAsStream有以下几种: 1. Class.getResourceAsStream(String p ...
- javascript 中 console 的用法
javascript 中 console 的用法 视频 https://www.bilibili.com/video/BV1g7411L751?from=search&seid=1567656 ...
最新文章
- 普通粒子群算法和优化方法
- vacode允许c_Visual Studio Code 配置C/C++环境
- 下拉选项框选中之后,通过ajax请求服务器,填充页面其他元素的value值
- linux虚拟网络设备之tun/tap驱动程序设计原理(五)
- arch Failed to load module intel
- POJ-1006 Biorhythms 中国剩余定理
- NC16886 炮兵阵地
- 那些有趣的电子漫画合集
- JavaWeb从开发环境搭建,到第一个servlet程序(图文)
- 【剑指offer】面试题66:构建乘积数组(Java)
- es6 对象中是否有键值_js/es6判断对象是否为空,并判断对象是否包含某个属性...
- auth java_java – 使用auth的httpget请求
- ios UICollectionViewLayout 横向瀑布流
- 【Python】keras使用Lenet5识别mnist
- java 需要返回类型_在Java中,当一个方法不需要返回数据时返回类型必须是
- 断网重启路由器就好_每天都要重启路由器?难怪WIFI越用越慢,宽带师傅透露其中窍门...
- 台达b3伺服modbus通讯_A2伺服modbus通讯难题-专业自动化论坛-中国工控网论坛
- 硬刚Hive | 4万字基础调优面试小总结
- 百度文库,道客巴巴等文库免积分下载
- CW测速雷达原理介绍