You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:37:18