首页 > 编程语言 >C#-反射机制的简单示例

C#-反射机制的简单示例

时间:2023-01-08 18:44:54浏览次数:37  
标签:反射 Console sender WriteLine 示例 C# work Student public

反射:指程序可以访问、检测和修改它本身状态或行为的一种能力;

通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。

例如有一个学生类Student,包含有字段,属性及方法

 1     class Student
 2     {
 3         public Student(string name, int age, bool isboy)
 4         {
 5             this.name = name;
 6             this.age = age;
 7             this.isBoy = isboy;
 8         }
 9         public string name;
10         public int grade = 3;
11         public int age;
12         public bool isBoy { get; set; }
13         public void Learn1(string work) { Console.WriteLine("I'm Working1 Now:" + work); }
14         public void Learn2(string work) { Console.WriteLine("I'm Working2 Now:" + work); }
15         public void Learn3(string work) { Console.WriteLine("I'm Working3 Now:" + work); }
16     }
Student

下面使用反射来对其进行各种操作,首先引入命名空间:

using System.Reflection;

使用反射实例化一个对象:

//Student stu = new Student("Frankie", 10, true);
Student stu = (Student)Activator.CreateInstance(typeof(Student), new[] { "Frankie", (object)10, (object)true });

使用反射获取Student类中都有哪些成员:

 1         static void GetAll(object sender)
 2         {
 3             Console.WriteLine("/*******获取对象中所有字段属性方法及值********/");
 4             Type t = sender.GetType();
 5             PropertyInfo[] pros = t.GetProperties();
 6             FieldInfo[] fies = t.GetFields();
 7             MethodInfo[] meths = t.GetMethods();
 8             foreach (var v in pros)
 9                 Console.WriteLine("属性:" + v.Name + ":" + v.GetValue(sender));
10             foreach (var v in fies)
11                 Console.WriteLine("字段:" + v.Name + ":" + v.GetValue(sender));
12             foreach (var v in meths)
13                 Console.WriteLine("方法:" + v.Name);
14         }
GetAll()

使用反射对stu对象中的字段和属性进行修改,并执行它的方法

 1         static void Modify(object sender)
 2         {
 3             Console.WriteLine("/*******修改对象的所有字段属性值并调用方法********/");
 4             Type t = sender.GetType();
 5             PropertyInfo p = t.GetProperty("isBoy");
 6             p.SetValue(sender, false);
 7             FieldInfo f = t.GetField("name");
 8             f.SetValue(sender, "jeny");
 9             f = t.GetField("grade");
10             f.SetValue(sender, 8);
11             f = t.GetField("age");
12             f.SetValue(sender, 15);
13             for (int i = 1; i < 4; i++)
14             {
15                 MethodInfo m = t.GetMethod("Learn" + i);
16                 m.Invoke(sender, new[] { i.ToString() });
17             }
18         }
Modify()

反射可以对每一个未知对象了如指掌且可以对其进行修改和方法调用。很有用!很强大!

  

标签:反射,Console,sender,WriteLine,示例,C#,work,Student,public
From: https://www.cnblogs.com/cfsl/p/17035078.html

相关文章

  • 数据分析读取本地文件案例的csv文件
    数据分析读取本地文件案例的csv文件: 有一组关于狗的名字的统计数据,为了观察这组数据情况,该如何读取?https://files.cnblogs.com/files/blogs/761321/dogNames2.rar?t=1673......
  • CodeForces - 835C Star sky
    CodeForces-835CStarsky题解:二维前缀和二维平面上给你点和坐标,让你求总亮度,很容易想到二维前缀和,但是题目很抽象,又给了你一个时间,就是说,每过一个单位时间,它的亮度......
  • c++ vector容器总结
    vector1.动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。(一般会找比预料更多的空间)2.vector容器构造1.构造vector​​<int>......
  • CodeForces - 1303D Fill the bag
    CodeForces-1303DFillthebag题解:二进制+思维首先我们发现这肯定与二进制有关,n的二进制形式肯定有1,所以我们去从低位到高位遍历n的二进制的时候,加入现在这一位是1,......
  • 第九节 RNP APCH保护区的绘制
    飞行程序设计软件实践PBN进近(RNPAPCH)程序在民用运输机场基本上实现了全覆盖,对于中小机场来说,某个方向上没有ILS进近程序的情况下,通常优先使用RNPAPCH程序。RNPA......
  • docker拉取镜像超时解决办法
    docker拉取镜像时,经常出现无法访问或者长时间下载不完的情况。是因为Docker的默认的镜像服务器DockerHub部署在海外,因此要解决这个问题只需要将镜像服务器地址指定为国内......
  • 注解实现CRUD
    使用注解开发会比配置文件开发更加方便。如下就是使用注解进行开发@Select(value="select*fromtb_userwhereid=#{id}")publicUserselect(intid);==注意:==......
  • 日常开发记录-Object函数的内置方法Object.entries
     constdata={id:1,name:"张三",age:22}letparams=""/*Object.entries()方法返回一个数组,数组的每一个元素是对象的自有的可枚举属性的键......
  • C - Count Connected Components -- ATCODER
    C-CountConnectedComponentshttps://atcoder.jp/contests/abc284/tasks/abc284_c 思路寻找独立的子连通图个数。 使用map记录边,即点之间的连通性使用vector记......
  • javascript 操作剪切板
    此库优点:支持电脑和手机端浏览器第一步:声明一个对象$(function(){varclipboard=newClipboardJS(document.getElementById("btnCopyFileShareLink"......