C#反射总结 Reflection,中文翻译为反射。这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成 ### C#反射技术详解 #### 一、反射概念与作用 反射(Reflection)是.NET框架中的一个重要特性,它提供了一种在运行时访问、检查和修改程序集(Assembly)、类型(Type)、方法(Method)等元数据的强大工具。通过反射,我们可以动态地创建对象、调用方法或获取类型信息等,这在某些场景下非常有用,例如在框架设计、插件机制、单元测试等方面。 #### 二、反射基础 .NET应用程序主要由以下几个组成部分构成: 1. **程序集(Assembly)**:一个或多个模块(Module)的集合,是.NET程序的基本部署单位。 2. **模块(Module)**:一个或多个类(Type)的集合,包含具体的代码实现。 3. **类型(Type)**:表示.NET程序中的类、接口、枚举、委托等。 反射技术为.NET提供了获取这些运行时类型信息的能力,并允许我们在运行时动态地创建和操作这些类型的实例。 #### 三、反射获取类型信息 .NET反射的核心在于`System.Type`类,它代表了.NET中的类型。我们可以通过各种方式获取`Type`对象,然后通过这个对象获取类型的相关信息。 以下是一个简单的示例代码: ```csharp using System; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { MyClass m = new MyClass(); Type type = m.GetType(); Console.WriteLine("名称:" + type.Name); Console.WriteLine("全名:" + type.FullName); Console.WriteLine("命名空间:" + type.Namespace); Console.WriteLine("程序集:" + type.Assembly); Console.WriteLine("模块:" + type.Module); Console.WriteLine("基类型:" + type.BaseType); Console.WriteLine("是否为类:" + type.IsClass); Console.WriteLine("成员信息"); MemberInfo[] memberInfos = type.GetMembers(); foreach (var item in memberInfos) { Console.WriteLine("{0}:{1}", item.MemberType, item); } } } class MyClass { public string m; public void test() { } public int MyProperty { get; set; } } } ``` #### 四、反射获取程序集信息 除了类型信息外,反射还可以用来获取程序集的信息。以下代码演示了如何获取当前执行的程序集的一些基本信息: ```csharp using System; public static void Main() { // 获取当前执行的程序集 Assembly assem = Assembly.GetExecutingAssembly(); Console.WriteLine("全名:" + assem.FullName); Console.WriteLine("版本号:" + assem.GetName().Version); Console.WriteLine("代码库位置:" + assem.CodeBase); Console.WriteLine("入口点:" + assem.EntryPoint); Type[] types = assem.GetTypes(); Console.WriteLine("类型:"); foreach (var item in types) { Console.WriteLine("名称:" + item.Name); } } ``` #### 五、动态创建对象与调用方法 反射不仅仅可以获取类型信息,还可以用于动态创建对象以及调用方法。以下是一个简单示例: ```csharp using System; public class Example { private int factor; public Example(int f) { factor = f; } public int SampleMethod(int x) { Console.WriteLine("\nExample.SampleMethod({0}) executes.", x); return x * factor; } } public static void Main() { // 获取当前执行的程序集 Assembly assem = Assembly.GetExecutingAssembly(); // 获取Example类型 Type exampleType = assem.GetType("ConsoleApplication2.Example"); // 创建Example实例 object example = Activator.CreateInstance(exampleType, 5); // 调用SampleMethod方法 MethodInfo methodInfo = exampleType.GetMethod("SampleMethod"); int result = (int)methodInfo.Invoke(example, new object[] { 10 }); Console.WriteLine("结果:" + result); } ``` #### 六、总结 反射作为.NET框架的一个重要特性,在开发过程中具有广泛的应用价值。它不仅可以帮助我们更好地理解程序集和类型的结构,还能实现动态创建和操作对象的功能,从而增强程序的灵活性和可扩展性。然而,反射操作通常比直接访问类型成员要慢,因此在性能敏感的场合应谨慎使用。


















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


最新资源
- 医学院校计算机专业课程体系构建的探索与实践.docx
- 开题报告项目管理系统设计.pdf
- 最新最专业的企业网站推广方案.doc
- 计算机网络课程设计说明书兰州市第九中学校园网组建方案.doc
- 网络销售实习报告1000字.docx
- 国际项目管理专业资质认证IPMP试题概论.doc
- 工业互联网体系架构.doc
- 海赋国际网络营销方案.pptx
- 组合投资风险与收益与其MATLAB实现.doc
- GOSP-硬件开发资源
- 嵌入式系统期末考试试卷.doc
- 软件学院软件工程领域代码.doc
- 基于Android手机蓝牙控制的智能小车设计.doc
- 电子商务公司的口号.doc
- 网络营销战略计划.pptx
- 三菱FX2N系列PLC.ppt


