C# 反射示例 demo
根据提供的文件信息,本文将详细解释C#反射的基本概念、用途以及通过给出的代码示例来深入了解其工作原理。 ### C# 反射基本概念 C#中的**反射**是一种强大的功能,允许程序在运行时获取类型的信息并创建或操作实例。通过反射,可以动态地加载程序集(Assembly),检索类型(Type)的信息,并调用类型的方法或属性等。反射在某些场景下非常有用,比如插件架构、动态加载组件、单元测试框架、ORM框架等。 ### 代码示例解析 #### 1. 命名空间引入 ```csharp using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Reflection; using System.Collections.Generic; ``` 这里引入了多个命名空间,包括`System.Reflection`,这表明我们将使用反射功能。其他命名空间虽然在这个示例中没有被直接使用,但它们通常是Web应用程序开发中的常见选择。 #### 2. 类定义与页面加载事件 ```csharp public partial class ReDemo : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //... } } ``` 这里定义了一个名为`ReDemo`的类,继承自`System.Web.UI.Page`,这表示它是一个ASP.NET Web页面的一部分。`Page_Load`方法是页面加载时自动触发的事件处理函数。 #### 3. 使用反射 ```csharp DateTime dtStart = DateTime.Now; for (int i = 0; i < 100000; i++) { // Assembly assembly = Assembly.LoadFile(@"E:\BLL\BLL\bin\Debug\BLL.dll"); // Type type = assembly.GetType("BLL.Demo"); // MethodInfo mi = type.GetMethod("getStrs"); // object obj = System.Activator.CreateInstance(type); // List<string> strs = (List<string>)mi.Invoke(obj, null); Demo demo = new Demo(); List<string> strs = demo.getStrs(); for (int j = 0; j < strs.Count; j++) { // Response.Write(strs[j] + "<br/>"); } } DateTime dtEnd = DateTime.Now; TimeSpan ts = dtEnd - dtStart; Response.Write("" + ts.TotalMilliseconds + ""); ``` 这段代码展示了如何使用反射来调用一个方法: - 尝试通过`Assembly.LoadFile`方法加载一个外部DLL文件(注释掉的部分),并从中获取特定类型的实例。 - 然后,通过`GetType`方法获取该类型,并使用`GetMethod`方法找到名为`getStrs`的方法。 - 接下来,使用`Activator.CreateInstance`创建该类型的实例,并调用之前获取的方法`Invoke`。 - 计算并输出执行这段代码所花费的时间。 ### 注释部分分析 实际上,示例中的注释部分是使用反射的标准方式,而未注释的代码则直接实例化了一个`Demo`对象并调用了`getStrs`方法。这种方式虽然简单,但缺乏反射所带来的灵活性。 ### 总结 本示例通过一个简单的循环结构,对比了直接调用方法和使用反射两种方式。反射提供了一种更灵活的方式来处理未知或动态变化的类型,但在性能上可能会有损失,如本例所示,反射的方式通常会比直接调用方法慢得多。因此,在实际应用中,需要权衡是否使用反射及其可能带来的性能影响。
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Reflection;
using System.Collections.Generic;
using BLL;
public partial class ReDemo : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
DateTime dtStart = DateTime.Now;
for (int ii = 0; ii < 100000; ii++)
{
////动态加载并获取程序集
//Assembly assembly = Assembly.LoadFile(@"E:\BLL\BLL\bin\Debug\BLL.dll");
////获得你要创建的类的类型
//Type type = assembly.GetType("BLL.Demo");
////得到你要调用方法
- 粉丝: 10
- 资源: 46
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
- 1
- 2
前往页