当前位置: 代码网 > it编程>编程语言>C# > C#中属性PropertyInfo使用示例小结

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

2024年06月14日 C# 我要评论
在c#中,propertyinfo是一个用于获取和设置属性的类。可以使用以下方式来使用propertyinfo:1.获取属性的type: 可以使用propertyinfo的propertytype属性

在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使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com