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