代码改变世界

反射的简单应用

  糯米粥  阅读(371)  评论(0编辑  收藏  举报

首先有一个类

复制代码
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication1
 8 {
 9     public class demo
10     {
11         public string name = "程序员";
12     }
13 }
复制代码

测试类

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{

    class Program
    {
        static void Main(string[] args)
        {

            Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
            Type type = assembly.GetType("ConsoleApplication1.demo");     //命名空间名 + 类名
            object obj = Activator.CreateInstance(type, true);

            FieldInfo classField = type.GetField("name");
            string name = classField.GetValue(obj).ToString();
            Console.WriteLine(name);

        }
    }
}
复制代码

运行后发现已经获取得到值了

 

因为Activator.CreateInstance是创建一个新实例。

 

但只想想想。这个name的值是固定的。也就是在项目中需要动态赋值

然后动态反射出来。即反射获取当前实例的值

复制代码
 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 ConsoleApplication1
 9 {
10 
11     class Program
12     {
13         static void Main(string[] args)
14         {
15 
16             //创建一个实例
17             demo d = new demo();
18             d.name = "开发工程师";
19 
20             FieldInfo field = d.GetType().GetField("name");//获取类中的一个Field
21             object fieldValue = field.GetValue(d);//获取这个实例中的Field的代表的属性
22 
23             //Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
24             //Type type = assembly.GetType("ConsoleApplication1.demo");     //命名空间名 + 类名
25             //object obj = Activator.CreateInstance(type, true);
26 
27             //FieldInfo classField = type.GetField("name");
28             //string name = classField.GetValue(obj).ToString();
29             Console.WriteLine(fieldValue);
30 
31         }
32     }
33 }
复制代码

结果是正确的。

 

博客园有很多前辈写的

http://www.cnblogs.com/davidyang78/archive/2010/06/09/1754562.html

http://www.cnblogs.com/zhangpengshou/archive/2012/03/21/2409206.html

 

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
'
点击右上角即可分享
微信分享提示