如何用 foreach 遍历方法中的所有参数?

咨询区

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

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值