如何用 foreach 遍历方法中的所有参数?

咨询区

  • Farhad

请问是否有办法可以遍历某个方法的 参数列表 中是否有 null 的情况,比如下面这样的伪代码:.

public void test (string arg1, string arg2, object arg3, DataTable arg4)
{
    foreach (var item in argus)
        {
            if( item == null)
             {
                throw;
             }
        }
   // do the rest...
}

回答区

  • Bjorn Coltof

你可以在方法参数中使用 params,这样你就可以实现对 方法参数列表 的遍历,我写了一个工具函数,代码如下:

public void CheckForNullArguments(params object[] args)
{
    foreach (object arg in args)
       if (arg == null) throw new ArgumentNullException();
}

或者用 linq 判断。

        public void CheckForNullArguments(params object[] args)
        {
            if (args.Any(a => a == null))
            {
                throw new ArgumentNullException("args");
            }
        }

然后就可以像下面这样调用。

CheckForNullArguments(arg1, arg2, arg3, arg4);

  • Adrian Iftode

楼上用 params ,我觉得太麻烦,如果你不想把项目中的每一个方法参数配上 params 前缀,我建议你使用 AOP 方式,比如说开源的 PostSharp,参考如下代码:

using System;
using System.Data;
using System.Reflection;
using PostSharp.Aspects;

namespace TestAOP
{
    class Program
    {
        static void Main(string[] args)
        {
            SomeClass someInstance = new SomeClass();
            someInstance.test(null, null, null, null);
        }
    }


    public class SomeClass
    {
        [CheckForNulls]
        public void test(string arg1, string arg2, object arg3, DataTable arg4)
        {           
            // do the rest...
        }
    }
    [Serializable]
    public class CheckForNullsAttribute : OnMethodBoundaryAspect
    {
        public override void OnEntry(MethodExecutionArgs args)
        {
            ParameterInfo[] parameters = args.Method.GetParameters();            
            for (int i = 0; i < args.Arguments.Count; i++)
            {
                if (args.Arguments[i] == null)
                    throw new ArgumentNullException(parameters[i].Name);
            }
        }
    }
}

如果想了解更多,参考:http://www.sharpcrafters.com

点评区

遍历 args 列表,让我想起了 js,用 aop 的思路确实不错,学习了。