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

19

能否循环遍历函数参数以检查它们中是否有任何一个为null(或通过另一个自定义函数进行检查)?类似这样:

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

什么是“argus”的正确关键字?我知道通过一些更多的if语句可以实现这一点,但正在寻找更快的方法...


我认为你需要研究一下反射。你试图做的事情似乎不值得麻烦,相比之下直接的方法(使用剪切和粘贴)更加容易。 - hatchet - done with SOverflow
在动态语言和具有元编程支持的静态类型语言中,可以以直接的方式实现此操作。例如,Nemerle 在其默认设计的契约库中具有 NotNull 关键字。 - Don Reba
我强烈建议逐个检查并使用特定参数名称抛出ArgumentNullException。您可以在单行上编写每个检查和抛出,从而最小化代码膨胀。这提供了更具体的反馈,并且编写起来不需要很长时间。如果您想节省时间,可以使用代码片段,大多数生产力工具都有一种方法来注入此代码(例如,ReSharper可以每个参数插入几个按键)。即使使用“原始”Visual Studio,自动完成也使手动编写此代码所需的按键数量相当少。 - Dan Bryant
4个回答

16

你可以使用params关键字来循环遍历所有参数,但是在方法本身中需要使用它们的类型。我会编写一个实用函数来检查null。

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

你可以在方法开头调用这个函数,例如:

CheckForNullArguments(arg1, arg2, arg3, arg4);

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);
            }
        }
    }
}

http://www.sharpcrafters.com/ 是获取PostSharp的网站,您也可以在那里找到相关文档。


+1 个赞,不错的 AOP 解决方案,这样你可以使用正确的名称抛出 ArgumentNullException,如果 Microsoft 能将其添加到 .Net 就好了... - Bjorn Coltof

6

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

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

除此之外,您可以使用反射,但似乎您并不是非常需要它


6
LINQ 的方式:
public static void Test(params object[] args)
{
    if (args.Any(a => a == null))
    {
        throw new ArgumentNullException("args");
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接