C#之反射(PropertyInfo类)

1、引入命名空间:System.Reflection;程序集:mscorlib(在mscorlib.dll中)

2、示例代码(主要是getType()、setValue()、getValue()方法):

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Reflection;
  5 using System.Text;
  6 using System.Threading.Tasks;
  7
  8 namespace 反射
  9 {
 10     class Program
 11     {
 12         /// <summary>
 13         /// 反射描述了程序集、模块、类型的对象(Type类型)。可以使用反射动态创建类型的实例,将实例绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性
 14         /// 如果代码中使用了特性,可以利用反射来访问它们
 15         /// </summary>
 16         static void Main(string[] args)
 17         {
 18
 19             //1、GetType()的解释及示例
 20             //
 21             // 摘要:
 22             //     获取当前实例的 System.Type。
 23             //
 24             // 返回结果:
 25             //     System.Type 实例,表示当前实例的确切运行时类型。
 26
 27             //下面使用静态方法GetType(从Object基类派生的所有类型都继承该方法)获取其类型的简单反射示例
 28             Student stu1 = new Student() { id = 1, name = "张三", length = 175, datetime = DateTime.Now };//
 29             Student stu2 = new Student() { id = 2, name = "李四", length = 180, datetime = DateTime.Now };//name = "李四", datetime = DateTime.Now
 30
 31             var list = new List<Student>();
 32             list.Add(stu1);
 33             list.Add(stu2);
 34
 35             Type stuType = stu1.GetType();
 36             Type listType = list.GetType();
 37
 38             Console.WriteLine("---------------getType()输出类型----------------");
 39             Console.WriteLine(stuType);//输出Student的类型
 40             Console.WriteLine(stu1.id.GetType());//输出Student的id的类型
 41             Console.WriteLine(stu1.name.GetType());//输出Student的name的类型
 42             Console.WriteLine(stu1.datetime.GetType());//输出Student的datetime的类型
 43
 44             Console.WriteLine(listType);//输出List的类型
 45
 46
 47             //2、GetProperties()的解释及示例
 48             //
 49             // 摘要:
 50             //     返回当前 System.Type 的所有公共属性。
 51             //
 52             // 返回结果:
 53             //     表示当前 System.Type 的所有公共属性的 System.Reflection.PropertyInfo 对象数组。- 或 -如果当前 System.Type
 54             //     没有公共属性,则为 System.Reflection.PropertyInfo 类型的空数组。
 55
 56             PropertyInfo[] stuPropertyS = stuType.GetProperties();
 57             PropertyInfo[] listPropertyS = listType.GetProperties();
 58
 59             //Console.WriteLine(stuPropertyS.Count());
 60             //Console.WriteLine(stuPropertyS.Length);
 61
 62             //3、SetValue()的解释及示例
 63             //
 64             // 摘要:
 65             //     用索引属性的可选索引值设置该属性的值。
 66             //
 67             // 参数:
 68             //   obj:
 69             //     将设置其属性值的对象。
 70             //
 71             //   value:
 72             //     此属性的新值。
 73             //
 74             //   index:
 75             //     索引化属性的可选索引值。对于非索引化属性,此值应为 null。
 76             //
 77             // 异常:
 78             //   System.ArgumentException:
 79             //     index 数组不包含所需类型的参数。- 或 -未找到该属性的 set 访问器。
 80             //
 81             //   System.Reflection.TargetException:
 82             //     该对象与目标类型不匹配,或者某属性是实例属性但 obj 为 null。
 83             //
 84             //   System.Reflection.TargetParameterCountException:
 85             //     index 中参数的数目与已编制索引的属性所采用的参数的数目不相符。
 86             //
 87             //   System.MethodAccessException:
 88             //     尝试非法访问某类中私有或受保护的方法。
 89             //
 90             //   System.Reflection.TargetInvocationException:
 91             //     设置属性值时出错。例如,为索引属性指定的索引值超出范围。System.Exception.InnerException 属性指示错误的原因。
 92             Console.WriteLine("---------------setValue()给某属性赋值----------------");
 93             PropertyInfo stuPro = stuPropertyS.FirstOrDefault(x => x.Name == "name");//这里是找name的属性名
 94             stuPro.SetValue(stu1, "王五", null);
 95             Console.WriteLine(stu1.name);
 96
 97
 98             //4、GetType()方法的解释和示例
 99             //
100             // 摘要:
101             //     用索引化属性的可选索引值返回指定对象的该属性值。
102             //
103             // 参数:
104             //   obj:
105             //     将返回其属性值的对象。
106             //
107             //   index:
108             //     索引化属性的可选索引值。 对于非索引化属性,该值应为 null。
109             //
110             // 返回结果:
111             //     指定对象的属性值。
112             //
113             // 异常:
114             //   System.ArgumentException:
115             //     index 数组不包含所需类型的参数。 - 或 - 未找到该属性的 get 访问器。
116             //
117             //   System.Reflection.TargetException:
118             //     该对象与目标类型不匹配,或者某属性是实例属性但 obj 为 null。
119             //
120             //   System.Reflection.TargetParameterCountException:
121             //     index 中参数的数目与已编制索引的属性所采用的参数的数目不相符。
122             //
123             //   System.MethodAccessException:
124             //     尝试非法访问某类中私有或受保护的方法。
125             //
126             //   System.Reflection.TargetInvocationException:
127             //     检索属性值时出错。 例如,为索引属性指定的索引值超出范围。 System.Exception.InnerException 属性指示错误的原因。
128             Console.WriteLine("---------------getValue()遍历属性值----------------");
129             foreach (var v in stuPropertyS)//遍历属性
130             {
131                 Console.WriteLine(v.GetValue(stu1, null));
132             }
133
134
135             Console.ReadLine();
136         }
137     }
138
139     public class Student
140     {
141         public int id { get; set; }
142         public string name { get; set; }
143         public decimal length { get; set; }
144         public DateTime datetime { get; set; }
145     }
146 }

3、运行结果:

4、下面是PropertyInfo 类型主要公开的成员,可供参考(摘自:http://msdn.microsoft.com/zh-cn/library/system.reflection.propertyinfo(v=vs.110).aspx

时间: 2024-10-12 18:06:18

C#之反射(PropertyInfo类)的相关文章

利用反射更新类

#region 利用反射更新类 /// <summary> /// 利用反射更新类 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="entity"></param> /// <param name="db"></param> public static void

反射操作工具类

using System; using System.Collections.Generic; using System.Data; using System.Reflection; namespace Framework.Utility { /// <summary> /// 反射操作工具类 /// </summary> public class ReflectionUtil { #region 根据反射机制将dataTable中指定行的数据赋给obj对象 /// <sum

C#反射操作工具类

在C#中通过反射机制将查询到的DataTable或DataReader转换成相对应的对象类型. 1 /// <summary> 2 /// 反射操作工具类 3 /// </summary> 4 public class ReflectionUtil 5 { 6 #region 根据反射机制将dataTable中指定行的数据赋给obj对象 7 8 /// <summary> 9 /// 根据反射机制将dataTable中指定行的数据赋给obj对象 10 /// </

反射工具类——ReflectUtils

测试方法:根据已知的方法名,来反射调用方法 package com.redmoon.forum.job; import java.util.ArrayList; import java.util.List; import com.common.utils.ReflectUtils; public class Test { private String name; public String getName() { return name; } public void setName(String

java 反射提取类信息, 动态代理 和过滤某些方法演示

package org.rui.classts.reflects; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.regex.Pattern; /** * 提取 类的 方法 构造器 * @author lenovo * */ //{args:ShowMethods} //查看一个类的所有方法和构造器 public class ShowMethods { private

反射获取类的几种方法

1 public class Demo { 2 3 /** 4 * 反射:加载类,获得类的字节码 5 * @param args 6 * @throws ClassNotFoundException 7 */ 8 public static void main(String[] args) throws ClassNotFoundException { 9 10 //1 11 Class clazz = Class.forName("Person"); 12 13 //2 14 Cla

通过反射查看类信息

通过反射查看类信息 1.获得Class对象的三个方式 (1)使用Class类的forName(String clazzName)静态方法.该方法需要传入字符串参数,该字符串参数的值是某个类的全限定名(必须添加完整的包名): //例如在JDBC中加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); (2)调用某个类的class属性来获取该类对应的Class对象: //假设现有Student类 //调用该类的class属性获取Class对象 Cla

黑马程序员——Java基础---反射Class类、Constructor类、Field类

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 反射的应用场景 一.概述 反射技术: Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的

Java反射(二)利用反射分析类的能力

利用反射分析类能力的类的源码如下(来源于<Java核心技术>卷一): package testreflection; import java.util.*; import java.lang.reflect.*; /** * 这个类利用反射打印出一个类的所有特征 * * @version 1.1 2004-02-21 * @author Cay Horstmann */ public class ReflectionTest { public static void main(String[]

反射工厂类

在.net 中,使用反射工厂类,可以方位动态链接库中 对象的元数据,动态创建对象, 具体理论以及实现这里不再详述. 现在引用一段代码,简单表示一下: /// <summary>        /// 使用没有添加引用的dll        /// </summary>        /// <typeparam name="T">要创建对象的类型</typeparam>        /// <param name="as