在c#中以对象[]的形式获取方法参数
本文关键字:获取 方法 参数 对象 | 更新日期: 2023-09-27 18:04:28
是否存在将所有方法参数转换为对象[]的黑暗,模糊的方法?
在使用消息代理实现两个系统之间的集成时,我注意到代理公开的大多数方法使用了大量参数。
我想要一种简单的方法来记录每个参数对代理的每次调用。比如:
[WebMethod]
public void CreateAccount(string arg1, int arg2, DateTime arg3, ... ) {
object[] args = GetMethodArgs();
string log = args.Aggregate("", (current, next) => string.Format("{0}{1};", current, next));
Logger.Log("Creating new Account: " + args);
// create account logic
}
我很好奇c#是否提供了一些模拟GetMethodArgs();
你可以有两个方法。
[WebMethod]
public void CreateAccount(string arg1, int arg2, DateTime arg3)
{
CreateAccountImpl(arg1, arg2, arg3);
}
protected void CreateAccountImpl(params object[] args)
{
string log = args.Aggregate("", (current, next) => string.Format("{0}{1};", current, next));
Logger.Log("Creating new Account: " + args);
// create account logic
}
PostSharp可以使用方法边界方面捕捉到这一点。下面是一些示例代码,看看它是如何工作的。
public sealed class Program
{
public static void Main()
{
Go("abc", 234);
}
[ParamAspect]
static void Go(string a, int b)
{
}
}
[Serializable]
public class ParamAspect : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
object[] argumentContents = args.Arguments.ToArray();
foreach (var ar in argumentContents)
{
Console.WriteLine(ar);
}
}
}
输出为:
abc
234
出于日志/审计的目的,我使用了Castle。动态代理来包装Web服务实现。所有的方法调用都被拦截并传递给一个IInterceptor对象,该对象可以访问参数和返回值。