c# 中 反射的用法

在网上查找了不少的资料,可以说大同小异,概念性的东西网上一搜一堆, 今天把反射的东西整理了一下,供大家使用,我保证我这里是最全面的东西,当然也是基础的东西, 在学好了这一切的基础上,大家可以学习反射的具体插件等应用,老鸟就不用看了. 在C#编程中,反射是一种强大的机制,允许程序在运行时检查自身并动态地操作代码。反射使得我们能够在不知道具体类名的情况下实例化对象、调用方法、访问属性和字段,甚至创建动态代理。以下是对标题和描述中提及的反射用法的详细解释: 1. **创建DLL库**:我们创建了一个名为`HelloWorld.dll`的类库。这个库包含了`Webtest`命名空间下的`ReflectTest`类,以及一个接口`interface1`。`ReflectTest`类实现了`interface1`,并定义了多个属性(`Write`、`Writea`、`Writeb`)、构造函数、静态和非静态方法,包括私有方法。 2. **使用反射**:在另一个项目中,我们引入了`HelloWorld.dll`,通过`Assembly.Load`方法加载这个库。`Assembly`类是反射的核心,它表示.NET程序集,包含了类型信息和元数据。 3. **获取类型信息**:通过`Assembly.GetTypes()`方法,我们可以得到程序集中所有的类型。在循环中,我们可以遍历这些类型,对每个类型进行进一步的操作。 4. **实例化对象**:反射可以让我们动态地创建对象。例如,如果我们知道类名,可以通过`Activator.CreateInstance`来实例化类。例如,对于`ReflectTest`类,可以这样创建对象:`var instance = Activator.CreateInstance(t.GetType("Webtest.ReflectTest"));` 5. **调用方法**:反射提供了`Type.GetMethod`方法来获取指定类型的方法信息。然后,可以使用`MethodInfo.Invoke`来执行方法。例如,调用`WriteString`方法: ```csharp MethodInfo writeStringMethod = aaa.GetMethod("WriteString"); string result = (string)writeStringMethod.Invoke(instance, new object[] { "name", 1 }); ``` 6. **访问属性**:类似地,`Type.GetProperty`可以获取属性信息,`PropertyInfo.GetValue`和`PropertyInfo.SetValue`用于读取和设置属性值。例如,获取和设置`Write`属性: ```csharp PropertyInfo writeProp = aaa.GetProperty("Write"); string writeValue = (string)writeProp.GetValue(instance); writeProp.SetValue(instance, "New Value"); ``` 7. **调用静态方法**:静态方法可以直接通过`Type.GetMethod`和`MethodInfo.Invoke`调用,无需实例化对象。例如,调用`WriteName`静态方法: ```csharp MethodInfo writeNameMethod = aaa.GetMethod("WriteName", BindingFlags.Static | BindingFlags.Public); string welcome = (string)writeNameMethod.Invoke(null, new object[] { "visitor" }); ``` 8. **访问私有成员**:默认情况下,反射只能访问公共成员。若要访问私有成员,需在方法调用时添加适当的`BindingFlags`,如`NonPublic`。例如,调用私有方法`WritePrivate`: ```csharp MethodInfo privateMethod = aaa.GetMethod("WritePrivate", BindingFlags.Instance | BindingFlags.NonPublic); string privateKey = (string)privateMethod.Invoke(instance, null); ``` 9. **委托和事件**:反射还可以用于动态创建委托并绑定到方法,这对于处理事件非常有用。在示例中定义了一个名为`TestDelegate`的委托类型,可以通过`Type.GetMethod`获取匹配的方法,并创建相应的委托实例。 10. **泛型和自定义属性**:反射也可以与泛型和自定义属性一起使用,使得程序更具灵活性。例如,可以遍历类型上的所有属性,检查它们是否带有特定的自定义属性。 总结起来,C#中的反射为开发者提供了动态操作代码的能力,无论是加载、实例化、调用方法、访问私有成员,还是处理事件,都变得可能。然而,反射在性能上相对较慢,因此在不需要动态行为或对性能敏感的场合,应谨慎使用。理解并熟练运用反射,可以提升代码的灵活性和可扩展性。
























- 鬼头猫2013-02-18文件还可以, 但没有代码
- gordenpan2012-08-21理论性!不过挺使用

- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- P管理软件使用规划.doc
- 菜谱类数据库设计-ER图设计.docx
- 工程施工中对工程分包的管理.doc
- 专项调查知识(三):专项调查的形式和问卷设计-secret.docx
- [天津]住宅小区工程雨季施工方案.doc
- 影响高职图书馆信息化服务的因素分析及对策.docx
- 第三章--注浆设备及器具.ppt
- 大数据背景下的移动互联网广告精准营销问题研究.docx
- 论计算机技术在图书馆管理中的应用.docx
- [四川]高速公路挡土墙施工作业指导书.doc
- 【精品】教师个人工作总结三篇.doc
- 信息化能力建设题库及标准答案.doc
- 卫生管理准则及分担区.doc
- 球阀的安装和维修手册.doc
- 计算机数据挖掘技术自动化控制平台.docx
- 荷载与结构设计方法.pdf


