c# 反射

C#中的反射是一种强大的机制,允许你在运行时动态地获取和操作程序集、类型、对象和成员的信息。反射使得你可以在不知道编译时类型的情况下,通过程序代码来获取、创建和操作对象。

以下是使用C#反射的一些常见用途:

  1. **获取程序集信息:** 你可以使用反射来加载程序集,并获取程序集的元数据信息,如程序集名称、版本、作者等。

  2. **获取类型信息:** 反射允许你获取类型的信息,包括名称、方法、字段、属性、事件等。你可以使用`Type`类来表示类型信息。

  3. **创建对象实例:** 通过反射,你可以根据类型信息动态创建对象实例,而不必在编译时知道类型。

  4. **调用方法和属性:** 反射使你能够在运行时调用对象的方法、访问属性、添加或删除事件处理程序等。

  5. **操作字段:** 你可以使用反射来读取和设置对象的字段值,包括私有字段。

  6. **检查特性:** 你可以检查类型、方法、属性等是否具有特定的自定义特性,并在运行时根据这些特性执行不同的逻辑。

下面是一个简单的示例,演示如何使用反射获取和使用类型信息:

```csharp

using System;

using System.Reflection;

class Program

{

static void Main()

{

// 加载程序集

Assembly assembly = Assembly.LoadFrom("SampleAssembly.dll");

// 获取类型信息

Type type = assembly.GetType("SampleNamespace.SampleClass");

// 创建对象实例

object instance = Activator.CreateInstance(type);

// 调用方法

MethodInfo method = type.GetMethod("SayHello");

method.Invoke(instance, null);

// 获取和设置属性

PropertyInfo property = type.GetProperty("Name");

property.SetValue(instance, "John Doe");

Console.WriteLine("Name: " + property.GetValue(instance));

// 检查是否具有特性

if (type.IsDefined(typeof(MyCustomAttribute), inherit: false))

{

Console.WriteLine("Type has MyCustomAttribute");

}

}

}

MyCustom("Sample")

namespace SampleNamespace

{

class SampleClass

{

public string Name { get; set; }

public void SayHello()

{

Console.WriteLine("Hello, " + Name);

}

}

AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)

sealed class MyCustomAttribute : Attribute

{

public MyCustomAttribute(string value)

{

Value = value;

}

public string Value { get; }

}

}

```

在上述示例中,我们加载了一个程序集,获取了类型信息,创建了对象实例,调用了方法,获取和设置了属性,并检查了类型是否具有自定义特性。这只是反射的基本用法,反射的功能非常强大,可以用于许多高级场景。但请注意,反射可能会引入性能开销,因此在使用反射时需要谨慎考虑性能方面的影响。

相关推荐
淡海水1 小时前
02-07-原理篇-GC暂停时间的本质
开发语言·unity·c#·gc·暂停时间
小羊没烦恼!3 小时前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
Behavior4 小时前
Unity 7.0 Alpha 拆解:编辑器干掉 Mono 换 CoreCLR
c#·unity3d·游戏开发
淡海水5 小时前
02-06-原理篇-增量式GC与并发GC
算法·unity·c#·并发·gc·增量
Vertira5 小时前
C# 函数封装成 DLL,
开发语言·c#
浅尝辄止;7 小时前
设计模式在HIS/LIS医疗系统中的完整实践指南(C#版)
开发语言·设计模式·c#
kimloner17 小时前
开源一个 376KB 的 Windows 桌面小工具:便签 + 截图标注 + OCR + 待办提醒(C# / WinForms)
windows·开源·c#·ocr·winforms
阿松爱学习18 小时前
【Unity开发】Aspose.PDF的使用
unity·pdf·c#
半亩码田18 小时前
C#转Python第4.8篇:正则表达式:Python re 模块 vs C# System.Text.RegularExpressions
python·正则表达式·c#
FPGA小徐19 小时前
【一生一芯 / PA】异常响应机制:RISC-V 中 ecall → mtvec → mret 的完整代
开发语言·数据库·c#