2

我有 Method2(args...),它由 Method1(args...) 调用。我想在 Method2 中获取 Method1 的参数的 VALUES 列表。使用反射 API 是不可能的,我认为 AOP(PostSharp,Spring.NET)可以提供帮助。但我找不到任何例子。

void Main()
{
    Method1(12, "the beatles")
}

void Method1(int number, string str)
{
    Method2("any value");
}

void Method2(string anything)
{
    Console.WriteLine(<argument_values_passed_to_Method1>); // output - 12, "the beatles"
}
4

1 回答 1

0

这个要求在上下文之外看起来很不寻常。例如,不清楚为什么不能将所有需要的参数传递给 Method2,或者将它们存储在类字段中。

我可以想象的一个用例是Method2一种常见的日志记录方法,可以从代码中的任何位置调用。PostSharp 确实可以帮助您以一种干净的方式实现这一点。

您需要创建一个方面类并从OnMethodBoudaryAspect. 然后根据需要注入新逻辑的方法内部的点(OnEntryOnExitOnException ......)覆盖一些方法。在你收到的被覆盖的方法内部MethodExecutionArgs,它让你可以访问方法参数、返回值、抛出的异常等。您可以在您的方面修改这些值。

下面是在方法入口记录参数值的切面示例:

[Serializable]
public class LogParametersAttribute : OnMethodBoundaryAspect
{
    public override void OnEntry(MethodExecutionArgs args)
    {
        Console.WriteLine("{0} is called with parameter values: {1}",
                          args.Method.Name,
                          string.Join(", ", args.Arguments));
    }
}

您可以通过将方面添加为属性来将方面应用于您的代码:

[LogParameters]
void Method1(int number, string str)
{
    // ...
}

您还需要将 PostSharp NuGet 包安装到您的项目中,以便 PostSharp 对您的项目进行后处理并介绍所有方面。

有关创建自己的切面的更多信息可以在文档中找到。

于 2013-12-19T11:02:13.330 回答