C#中属性PropertyInfo使用示例小结

 更新时间:2024年06月04日 09:53:03   作者:zgscwxd  
在C#中,PropertyInfo是一个用于获取和设置属性的类,这篇文章主要介绍了C#中属性PropertyInfo怎么使用,需要的朋友可以参考下

在C#中,PropertyInfo是一个用于获取和设置属性的类。可以使用以下方式来使用PropertyInfo:

1.获取属性的Type: 可以使用PropertyInfo的PropertyType属性来获取属性的类型。例如,如果有一个名为"Name"的属性,可以使用以下代码获取属性的类型:

PropertyInfo propertyInfo = typeof(ExampleClass).GetProperty("Name");
Type propertyType = propertyInfo.PropertyType;

2.获取属性的值: 可以使用PropertyInfo的GetValue方法来获取属性的值。需要提供一个对象实例作为参数,表示从该对象中获取属性的值。例如:

ExampleClass example = new ExampleClass();
example.Name = "John";
PropertyInfo propertyInfo = typeof(ExampleClass).GetProperty("Name");
object propertyValue = propertyInfo.GetValue(example);

3.设置属性的值: 可以使用PropertyInfo的SetValue方法来设置属性的值。需要提供一个对象实例和要设置的值作为参数。例如:

ExampleClass example = new ExampleClass();
PropertyInfo propertyInfo = typeof(ExampleClass).GetProperty("Name");
propertyInfo.SetValue(example, "John");

这些是PropertyInfo的一些基本用法。还可以使用其他方法和属性来进行更高级的操作,例如获取和设置属性的访问修饰符、属性的特性等。

常规属性

看下常规属性的完成构成:

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

private string _age;

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

自动属性

上面简单的说了一下常规属性,当属性访问器中不需要其他逻辑时,可以使用自动属性,

public int Id { get; set; }

简单的对比一下常规属性和自动属性之间的区别吧:

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

        2自动实现的属性上可以使用特性,不能用在支持后备字段上。 如果属性的后备字段上使用特性,则应该只创建常规属性。
        3.自动实现属性get,和set中不能包含特殊的逻辑处理。与字段类似,但不同于字段。与字段不同,属性不作为变量来分类,不能将属性作为 ref参数或 out参数传递。

属性PropertyInfo的使用

定义Person类:

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类

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

转换方法:

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;
}

方法的调用:

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();
      }

2.之前在做Winform的时候就经常回使用到SqlHelper,现在也有很多公司是这么使用的,当时很多东西感觉就是重复性的操作,一度以为编程只是复制粘贴,下面这段代码大家应该很常见:

List<Person> list = new List<Person>();
SqlDataReader sdr = new SqlDataReader();
while (sdr.Read())
{
    Person person = new Person();
    person.Name = sdr.GetString(0);
    //....下面类似
    list.Add(person);
}

开始写的时候觉得是锻炼了,写的多了就觉得无聊了,其实完全可以换一种方式来实现上面的代码:

public static List<T> ConvertData<T>(SqlDataReader sdr)
     {
         List<T> list = new List<T>();
         Type type = typeof(T);
         PropertyInfo[] properties = type.GetProperties();
         while (sdr.Read())
         {
             T model = Activator.CreateInstance<T>();
             for (int i = 0; i < properties.Length; i++)
             {
                 for (int j = 0; j < sdr.FieldCount; j++)
                 {
                     //判断属性的名称和字段的名称是否相同
                     if (properties[i].Name == sdr.GetName(j))
                     {
                         Object value =sdr[j];
                         //将字段的值赋值给User中的属性
                         properties[i].SetValue(model, value, null);
                     }
                 }
             }
             list.Add(model);
         }
         return list;
     }
List<User> list = new List<User>();
SqlDataReader sdr = cmd.ExecuteReader();
list = ConvertData<User>(sdr);

到此这篇关于C#中属性PropertyInfo怎么使用的文章就介绍到这了,更多相关C# PropertyInfo使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#获取变更过的DataTable记录的实现方法

    C#获取变更过的DataTable记录的实现方法

    这篇文章主要介绍了C#获取变更过的DataTable记录的实现方法,对初学者很有学习借鉴价值,需要的朋友可以参考下
    2014-08-08
  • C#怎样才能将XML文件导入SQL Server

    C#怎样才能将XML文件导入SQL Server

    怎样才能将XML文件导入SQL Server 2000,主要使用了接口以及简单工厂来实现将xml文件导入到sql数据库中,将XML文件导入SQL Server有若干种方法,这里提供其中的3种需要的朋友可以参考下
    2012-12-12
  • .NET智能处理Word文档之文本查找替换与书签操作完全指南

    .NET智能处理Word文档之文本查找替换与书签操作完全指南

    本文将详细介绍如何使用MudTools.OfficeInterop.Word库来执行文本查找替换操作,包括普通文本替换、高级通配符替换以及替换为剪贴板内容等高级功能,有需要的可以了解下
    2025-09-09
  • 比较有效的使用C#读取文件的代码

    比较有效的使用C#读取文件的代码

    比较有效的使用C#读取文件的代码...
    2007-08-08
  • 使用C#实现简单的线性回归的代码详解

    使用C#实现简单的线性回归的代码详解

    最近注意到了NumSharp,想学习一下,最好的学习方式就是去实践,因此从github上找了一个用python实现的简单线性回归代码,然后基于NumSharp用C#进行了改写,需要的朋友可以参考下
    2024-01-01
  • C#自定义基于控制台的Timer实例

    C#自定义基于控制台的Timer实例

    这篇文章主要介绍了C#自定义基于控制台的Timer实现方法,可以简单模拟timer控件的相关功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C#登入实例

    C#登入实例

    本篇文章通过截图的方式向大家展示C#程序登陆实现的全过程,利用了C#三层架构的编写方法,希望对大家今后编写代码有所帮助
    2016-11-11
  • C#根据身份证号码判断出生日期和性别

    C#根据身份证号码判断出生日期和性别

    这篇文章主要为大家详细介绍了C#根据身份证号码判断出生日期和性别的方法,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 详解C# partial 关键字的使用

    详解C# partial 关键字的使用

    局部类型允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中。接下来通过本文给大家分享C# partial 关键字的使用,感兴趣的的朋友一起看看吧
    2017-08-08
  • C#中实体类与XML相互转换方式

    C#中实体类与XML相互转换方式

    这篇文章主要介绍了C#中实体类与XML相互转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论