C#面试题更新 2026-08-05

在 C# 开发中,采用反射和动态代理机制来构建 AOP(面向切面编程)的完整方案是什么?需要涵盖代理的创建方式、拦截逻辑的注入,以及该方案在性能和灵活性上的考量。

性能优化技术原理方案权衡C#

考察说明

考查对 C# 反射机制和动态代理原理的理解,以及如何运用它们实现面向切面编程的基本能力。

回答思路

  1. 【回答框架 1】AOP 的核心是将横切关注点(如日志、事务)从业务逻辑中分离,通过代理对象在方法调用前后插入增强逻辑。C# 中基于反射和动态代理的实现,常见有两种方式:一种是通过 DispatchProxy 类,另一种是使用第三方库如 Castle DynamicProxy。
  2. 【回答框架 2】使用 DispatchProxy 时,需要创建继承自 DispatchProxy 的代理类,并实现 Invoke 方法。在 Invoke 中,通过方法信息调用目标方法,并可以在调用前后执行切面逻辑。使用时通过 DispatchProxy.Create 创建代理实例,并传入目标实例和代理类型。
  3. 【回答框架 3】Castle DynamicProxy 提供了更灵活的功能,通过 ProxyGenerator 创建代理,结合拦截器(IInterceptor)的 Intercept 方法实现 AOP。它支持基于接口的代理和基于类的代理,且能处理非虚方法(需要额外配置)。
  4. 【回答框架 4】性能上,反射调用有开销,且动态代理生成的类型会增加内存占用。优化手段包括缓存动态生成的程序集、使用表达式树替代反射、或者考虑在 AOP 需求不复杂时使用源生成器(Source Generator)在编译期生成代码。
  5. 【关键点 1】AOP 实现的核心是代理模式,通过反射和动态代理在运行时生成代理类型。
  6. 【关键点 2】DispatchProxy 基于反射调用方法,性能有瓶颈;Castle DynamicProxy 使用表达式树和缓存优化性能。
  7. 【关键点 3】代理仅对可覆写的方法生效,接口代理和类代理行为不同。
  8. 【关键点 4】动态代理无法拦截静态方法、私有方法,需注意使用场景。
  9. 【关键点 5】性能敏感场景下考虑源生成器、编译期织入或代码简化。
  10. 【易错点 1】容易误以为动态代理能拦截所有方法,实际上无法拦截构造函数、静态方法等。
  11. 【易错点 2】反射调用频繁时可能成为性能热点,需要评估是否采用缓存或替代方案。
  12. 【易错点 3】多层代理可能导致调用链复杂和调试困难,需控制代理层次。