使用PostSharp获取调用方法的值

时间:2013-11-08 10:37:44

标签: reflection postsharp

我有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"
}

1 个答案:

答案 0 :(得分:0)

此要求在上下文中看起来不寻常。例如,为什么你不能将所有必需的参数传递给Method2,或者将它们存储在类字段中,这一点并不明显。

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

您需要创建 aspect 类并从OnMethodBoudaryAspect派生,而不是编写方法。然后根据您需要注入新逻辑的方法中的一些方法覆盖一些方法( OnEntry OnExit OnException ,. ..)。 在重写的方法中,您会收到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对项目进行后期处理并介绍所有方面。

有关创建自己方面的更多信息,请参阅documentation