2011-07-24 45 views
12

是否有可能通过循环函数参数来检查它们中的任何一个是否为空(或通过另一个自定义函数检查它们)? 是这样的: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... 
} 

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

+0

我认为你需要考虑反思。你试图做的似乎不值得麻烦与直截了当的方法(这很容易与剪切和粘贴)。 – hatchet

+0

在动态语言和支持元编程的静态类型语言中,这是可以直接做到的。例如,Nemerle在合约库的默认设计中有NotNull关键字。 –

+0

我强烈建议单独检查每一个,并使用特定参数名称引发ArgumentNullException。你可以写出每一张支票并放在一行上,最大限度地减少代码膨胀。这给出了更具体的反馈,并且不需要很长时间来编写。如果您想节省时间,可以使用代码片段,大多数生产力工具都有注入此代码的方法(例如,ReSharper可以插入支票,每个参数键击几次)。即使使用'vanilla'Visual Studio,自动完成这使得手写需要相当少的击键。 –

回答

6

我想你不想改变PARAMS每个方法你的项目。你可以使用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,你也可以在那里找到doc。

+1

问题:什么是AOP? – Sam

+0

http://en.wikipedia.org/wiki/Aspect-oriented_programming –

+0

+1对于不错的AOP解决方案,这样你就可以用正确的名称抛出ArgumentNullException,如果只有MS会将它添加到.Net ... –

5

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

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

除此之外,你可以使用反射,但看起来你并不需要它那么严重

13

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

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

你可以在你的方法像

CheckForNullArguments(arg1, arg2, arg3, arg4); 
3

的LINQ方式开始通话这样:

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