C# 在C中作为对象[]获取方法参数#

C# 在C中作为对象[]获取方法参数#,c#,log4net,C#,Log4net,是否有任何黑暗、模糊的方式将所有方法参数转换为对象[] 在使用消息代理实现两个系统之间的集成时,我注意到代理公开的大多数方法都使用了大量参数 我想要一种简单的方法,用每个参数记录对代理的每个调用。比如: [WebMethod] public void CreateAccount(string arg1, int arg2, DateTime arg3, ... ) { object[] args = GetMethodArgs(); string log = args.Aggre

是否有任何黑暗、模糊的方式将所有方法参数转换为对象[]

在使用消息代理实现两个系统之间的集成时,我注意到代理公开的大多数方法都使用了大量参数

我想要一种简单的方法,用每个参数记录对代理的每个调用。比如:

[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
}

出于日志记录/审计的目的,我使用了包装Web服务实现。所有的方法调用都被截获并传递给一个IInterceptor对象,该对象可以访问参数和返回值。

可以使用方法边界特性来捕获它。下面是一些示例代码,可以看到它的实际应用

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

尝试前面的问题:然后您必须知道create account逻辑其余部分的参数的位置和类型。CreateAccountImpl已重命名为LogMessage。它获取一个params对象[]args并记录。创建帐户逻辑将在LogMessage调用之后立即保留在create account方法上。PostSharp看起来是最佳选项,但它似乎与.net framework 3存在一些兼容性问题。5@Daniel:我一直在使用PostSharp和.NET3.5,一点问题也没有。我知道他们在一两年前对其应用程序进行了重大更改,因此旧版本可能会有问题-但如果您坚持使用当前版本,我希望您会没事。我已经下载了2.0.9.3版本,当我尝试引用dll时,它会说“PostSharp.dll”或其依赖项之一,需要更新版本的.NET Framework。这肯定是VS问题,而不是Framework或PostSharp问题(可能是安装问题,但不是运行时问题)。我注意到我在VS2010和.NET3.5中收到了相同的警告,但我忽略了它,应用程序仍然正常工作。VS2008看起来还可以,VS2010和.NET4.0也可以,但是VS2010/3.5的这个引用有点奇怪。但是如果你觉得幸运的话,我会说去用它,你会没事的。我保证我会试试的。谢谢你的提示