简单的对比一下常规属性和自动属性之间的区别吧: 1.自动实现的属性必须同时声明 get 和 set 访问器

时间:2022-06-22 08:25:35

昨天编程遇到一个问题两个类字段都是二十多个,此中有十多个是不异的,需要将一个类的字段赋值给此外一个类,开始的本身想手动的一个个去赋值,后来想来一下C#根本常识,用PropertyInfo就可以解决类似的问题,博客园写博客需要内容详实,我还是慢慢的C#属性从新写起,先看部属性的界说吧:

属性界说:它供给灵活的机制来读取、编写或计算某个私有字段的值。 可以像使用大众数据成员一样使用属性,但实际上它们是称作“访谒器”的特殊要领。 这使得可以轻松访谒数据,别的还有助于提高要领的安适性和灵活性。属性凡是可以分为通例属性和自动属性。两者之间还是有一点区另外,最开始编程对着两个全无观点。

通例属性

通例属性以前做Winform的时候经常使用,此刻开始使用EF,根基上都是使用自动属性,看下通例属性的完成组成:

1.私有字段,一般设置为私有,通过属性来赋值保证起安适性:

1

 

private string _age;

 

2.get访谒器,卖力读取数据,此中可以进行本身的逻辑判断和数据验证,以return或者throw结束:

1

2

3

4

5

 

get

{

//春秋返回值判断

return _age> 0 ? _age: 0;

}

 

3.set访谒器,卖力给属性赋值,类似于一个返回类型为void的要领,可以包罗逻辑措置惩罚惩罚,例如可以按照默认的值通过计算后返回功效。

自动属性

上面简单的说了一下通例属性,当属性访谒器中不需要其他逻辑时,可以使用自动属性,不过需要注意一点的就是声明自动属性时,编译器将创建一个私有的匿名后备字段,该字段只能通过属性的 get 和 set 访谒器进行访谒。

1

 

public int Id { get; set; }

 

自动属性没有太多可以可以说的对象,简单的比拟一下通例属性和自动属性之间的区别吧:

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

2自动实现的属性上可以使用特性,不能用在撑持后备字段上。 如果属性的后备字段上使用特性,则应该只创建通例属性。
        3.自动实现属性get,和set中不能包罗特殊的逻辑措置惩罚惩罚。与字段类似,但差别于字段。与字段差别,属性不作为变量来分类,不能将属性作为 ref参数或 out参数通报。

属性PropertyInfo的使用

上面概略简单的说了一部属性和自动属性之间的区别,,此刻可以回归到文中最开始的时候的阿谁问题:

1.案例1,如果两个类中有大部分的字段不异,需要将此中一个类的字段赋值给此外一个类:

界说Person类:

1

2

3

4

5

6

7

8

9

10

11

 

public class Person {

public Person(int id,string name,string address)

{

this.Id = id;

this.Name = name;

this.Address = address;

}

public int Id { get; set; }

public string Name { get; set; }

public string Address { get; set; }

}

 

界说User类

1

2

3

4

5

 

public class User {

public int Id { get; set; }

public string Name { get; set; }

public string Group { get; set; }

}

 

 转换要领:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

 

public static User ConvertObject(User user,Person person)

{

PropertyInfo[] userPro = user.GetType().GetProperties();

PropertyInfo[] personPro = person.GetType().GetProperties();

if (userPro.Length>0&&personPro.Length>0)

{

for (int i = 0; i < userPro.Length; i++)

{

for (int j = 0; j < personPro.Length; j++)

{<br>              //判断User的属性是不是的Person中

if (userPro[i].Name == personPro[j].Name && userPro[i].PropertyType == personPro[j].PropertyType)

{

Object value=personPro[j].GetValue(person, null);

  //将Person中属性的值赋值给User<br>                  userPro[i].SetValue(user,value , null);

}

}

}

}

return user;

}

 

 要领的挪用:

1

2

3

4

5

6

7

8

9

10

 

static void Main(string[] args)

{

Person person = new Person(1,"FlyElephant","北京");

User user = new User();

user.Id = 20;

user = ConvertObject(user, person);

Console.WriteLine("Id:" + user.Id + "Name:" + user.Name + "角色:" + user.Group);

System.Console.Read();

}