如何在自定义Method Attribute中获取方法调用时传入的参数?
结论:不能直接在自定义特性内部实现这个需求
核心原因
特性本质是编译期嵌入程序集元数据的标记,它的实例化和代码执行时机完全独立于方法调用:
- 特性不会在方法被调用时自动触发执行,只有当你通过反射显式获取该特性时,它的代码才会运行
- 就算你在特性里写了获取调用栈的代码,此时的调用栈是反射获取特性的栈,而非
MyMethod被调用时的栈,根本拿不到目标方法的参数
可行的替代方案
- 用AOP拦截器实现:借助Autofac、Castle DynamicProxy这类AOP框架,定义方法拦截器。拦截器可以在方法执行前后拿到完整的调用上下文,包括传入的参数,效果和你预想的一致,但这是框架帮你完成的拦截,不是特性本身的能力。
- 方法内部手动触发:在
MyMethod内部,通过反射获取自身的MyAttribute,然后把参数主动传给特性的处理方法,比如:
[MyAttribute] public void MyMethod(SomeClass prop) { var attr = typeof(MyClass).GetMethod(nameof(MyMethod)) .GetCustomAttribute<MyAttribute>(); attr.ProcessParameter(prop); // 原有逻辑 }
- 诊断追踪方案:如果是监控场景,可以用.NET的
DiagnosticSource,在方法调用时发布包含参数的诊断事件,后续再消费这些事件,但这个更偏向于日志/监控,不是实时处理参数。
内容的提问来源于stack exchange,提问作者johnny 5
相关产品推荐
相关产品推荐

