咨询区
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 的思路确实不错,学习了。