如何使用Metalama的OverrideMethodAspect获取方法行号并加入StringBuilder?
使用Metalama的OverrideMethodAspect获取目标方法行号并写入StringBuilder
直接上实现方案,以下是完整的Aspect定义和使用示例:
Aspect 实现代码
using Metalama.Framework.Aspects; using Metalama.Framework.Code; using System.Text; public class AddLineNumberToStringBuilderAttribute : OverrideMethodAspect { public override dynamic? Override() { // 获取目标方法的源代码起始行号 var targetLineNumber = meta.Target.Method.DeclarationStartLine; // 查找方法参数中的StringBuilder实例 var sbParam = meta.Target.Parameters.FirstOrDefault(p => p.Type.Equals(typeof(StringBuilder))); if (sbParam != null) { // 将行号追加到目标StringBuilder ((StringBuilder)sbParam.Value).AppendLine($"方法行号: {targetLineNumber}"); } // 执行原方法的业务逻辑 return meta.Proceed(); } }
使用示例
public class BusinessLogic { // 给需要处理的方法添加Aspect特性 [AddLineNumberToStringBuilder] public void GenerateReport(StringBuilder reportBuilder) { reportBuilder.Append("生成业务报告..."); } } // 调用代码 var reportSb = new StringBuilder(); var logic = new BusinessLogic(); logic.GenerateReport(reportSb); // 输出结果会包含原内容和行号 Console.WriteLine(reportSb.ToString());
关键细节说明
meta.Target.Method.DeclarationStartLine:Metalama编译时注入的API,直接获取目标方法在源代码中的起始行号,不需要额外调试符号。meta.Target.Parameters:通过这个API访问目标方法的所有参数,这里筛选出StringBuilder类型的参数进行操作。meta.Proceed():必须调用此方法执行原方法逻辑,否则原方法代码不会被运行。- 若目标方法无
StringBuilder类型参数,Aspect会自动跳过追加行号操作,不影响原方法正常执行。
注意事项
确保项目已安装Metalama.Framework NuGet包,可通过Package Manager控制台安装:
Install-Package Metalama.Framework
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

