【问题标题】:Getting method parameters as an object[] in C#在 C# 中将方法参数作为对象 [] 获取
【发布时间】:2011-10-19 04:25:45
【问题描述】:

有没有什么晦涩难懂的方法可以将所有方法参数转换成一个对象[]?

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

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

[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();

【问题讨论】:

标签: c# log4net


【解决方案1】:

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

【讨论】:

  • PostSharp 看起来是最好的选择,但它似乎与 .net framework 3.5 存在一些兼容性问题
  • @Daniel:我一直在使用带有 .NET 3.5 的 PostSharp,完全没有任何问题。我知道他们在一两年前对其应用程序进行了重大更改,因此旧版本可能会出现问题 - 但如果您坚持使用当前版本,我希望您会没事的。
  • 我下载了 2.0.9.3 版本,当我尝试引用 dll 时,它说“PostSharp.dll”或其依赖项之一需要更高版本的 .NET Framework。
  • 肯定是VS的问题,不是框架或PostSharp的问题(可能是安装问题,但不是运行时问题)。我注意到我在使用 .NET 3.5 的 VS2010 中收到了相同的警告,但我忽略了它,并且该应用程序仍然可以正常工作。 VS2008 似乎还可以,带有 .NET 4.0 的 VS2010 也可以,但是对于 VS2010/3.5 的这个引用有些奇怪。但如果你觉得幸运的话,我会说继续使用它,你应该会没事的。
  • 我保证我会试一试。感谢您的提示
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你可以只有两种方法。

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

    【讨论】:

    • 那么您必须知道其余创建帐户逻辑的参数的位置和类型。
    • 我调整了您的解决方案以达到更通用的目标。 CreateAccountImpl 已重命名为 LogMessage。它得到一个 params object[] args 然后记录。在 LogMessage 调用之后,创建帐户逻辑将保留在创建帐户方法上。
    猜你喜欢
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2020-06-05
    • 1970-01-01
    • 2012-01-07
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多