C# - 使用foreach循环遍历方法参数

Far*_*had 16 .net c# foreach

是否可以循环一个函数参数来检查它们中的任何一个是否为空(或者由另一个自定义函数检查它们)?这样的事情:

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

什么是"argus"的正确关键字?我知道这可以通过更多的if语句,但寻找更快的方式......

小智 14

您可以使用params关键字循环遍历所有参数,但之后您将在方法本身中使用它们的类型.我会编写一个检查null的实用程序函数.

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

您可以在方法的开头调用此方法

CheckForNullArguments(arg1, arg2, arg3, arg4);
Run Code Online (Sandbox Code Playgroud)


Adr*_*ode 7

我想你不想改变你项目中每个方法的参数.您可以使用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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

http://www.sharpcrafters.com/获取PostSharp,你也可以在那里找到doc.


bev*_*qua 5

如果你想要一种简单的循环参数方法,你应该考虑使用params关键字

public void test (params object args[])
{
    foreach(var argument in args)
    {
        if(item == null)
        {
            throw new ArgumentNullException();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

除此之外,你可以使用反射,但似乎你不需要它那么糟糕


小智 5

LINQ方式:

public static void Test(params object[] args)
{
    if (args.Any(a => a == null))
    {
        throw new ArgumentNullException("args");
    }
}
Run Code Online (Sandbox Code Playgroud)