1. C#反射机制深度解析
反射是.NET框架中最强大的特性之一,它允许程序在运行时动态获取类型信息并操作对象。我在实际开发中经常使用反射来实现插件系统、动态加载程序集等场景。比如最近开发的设备控制系统中,就通过反射实现了不同厂商驱动程序的动态加载。
反射的核心是通过System.Reflection命名空间下的类来获取程序集和类型信息。Type类是反射的入口点,通过typeof运算符或GetType()方法都能获取Type对象。这个对象就像类型的"身份证",包含了该类型的所有元数据。
注意:反射虽然强大,但过度使用会影响性能。在性能敏感的代码路径中应谨慎使用反射。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 反射核心功能实现
2.1 动态加载程序集
Assembly.Load()方法是最常用的程序集加载方式。我在一个多租户系统中使用这种方式实现了不同客户定制模块的动态加载:
csharp复制// 加载指定路径的程序集
var assembly = Assembly.LoadFrom("Plugin.dll");
// 获取程序集中所有公共类型
Type[] types = assembly.GetExportedTypes();
实际项目中遇到过DLL版本冲突的问题,后来通过AppDomain.CurrentDomain.AssemblyResolve事件解决了程序集加载失败的情况。
2.2 类型成员访问
通过Type对象可以获取构造函数、方法、属性等成员信息。在开发ORM框架时,我这样动态获取实体类属性:
csharp复制Type type = typeof(Product);
PropertyInfo[] properties = type.GetProperties();
foreach (var prop in properties)
{
Console.WriteLine($"属性名:{prop.Name} 类型:{prop.PropertyType}");
}
这里有个技巧:使用BindingFlags可以精确控制要获取的成员类型。比如BindingFlags.NonPublic可以获取私有成员,这在单元测试中很有用。
2.3 动态创建对象
Activator.CreateInstance是创建对象实例的便捷方法。在实现依赖注入容器时,我这样动态创建服务实例:
csharp复制Type serviceType = typeof(MyService);
object instance = Activator.CreateInstance(serviceType);
对于有参数的构造函数,可以这样处理:
csharp复制ConstructorInfo ctor = type.GetConstructor(new[] { typeof(string) });
object
