【问题标题】:C# - Using foreach to loop through method argumentsC# - 使用 foreach 循环方法参数
【发布时间】:2011-07-24 13:42:09
【问题描述】:

是否可以遍历函数参数以检查它们是否为空(或通过另一个自定义函数检查它们)? 像这样:

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 语句来实现,但正在寻找一种更快的方法......

【问题讨论】:

  • 我认为您需要考虑反思。与简单的方法相比,您尝试做的事情似乎不值得麻烦(这很容易通过剪切和粘贴)。
  • 这可以在动态语言和具有元编程支持的静态类型语言中以直接的方式完成。例如,Nemerle 在其默认设计的合约库中具有 NotNull 关键字。
  • 我强烈建议单独检查每一个并抛出带有特定参数名称的 ArgumentNullException。您可以写出每个检查并在一行中抛出,从而最大限度地减少代码膨胀。这提供了更具体的反馈,并且不会花费很长时间来编写。如果您想节省时间,您可以使用 sn-p,并且大多数生产力工具都有注入此代码的方法(例如,ReSharper 可以通过每个参数的几次击键插入检查。)即使使用“vanilla”Visual Studio,Auto -completion 使得手工编写这个需要相当少的击键。

标签: c# .net foreach


【解决方案1】:

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

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

您可以在方法的开头调用它,例如

CheckForNullArguments(arg1, arg2, arg3, arg4);

【讨论】:

    【解决方案2】:

    我想您不想更改项目中的每个方法的参数。您可以使用 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,只要 MS 将其添加到 .Net...
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      LINQ 方式:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-12
        • 1970-01-01
        • 1970-01-01
        • 2016-02-02
        • 2020-02-06
        • 1970-01-01
        • 2013-01-09
        相关资源
        最近更新 更多