C # - Использование foreach для обхода аргументов метода - PullRequest
14 голосов
/ 24 июля 2011

Можно ли перебрать аргументы функции, чтобы проверить, является ли какой-либо из них нулевым (или проверить их другой пользовательской функцией)?как-то так:

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, но в поисках более быстрого пути ...

Ответы [ 4 ]

14 голосов
/ 24 июля 2011

Вы можете использовать ключевое слово params для циклического перебора всех аргументов, но тогда вы будете использовать их тип в самом методе.Я написал бы служебную функцию, которая проверяет на ноль.

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

Вы можете вызвать это в начале вашего метода, как

CheckForNullArguments(arg1, arg2, arg3, arg4);
7 голосов
/ 24 июля 2011

Полагаю, вы не хотите менять в 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, также вы можете найти документ там.

5 голосов
/ 24 июля 2011

Способ LINQ:

public static void Test(params object[] args)
{
    if (args.Any(a => a == null))
    {
        throw new ArgumentNullException("args");
    }
}
5 голосов
/ 24 июля 2011

Если вам нужен простой способ перебора аргументов, вам следует подумать об использовании ключевого слова params

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

Кроме того, вы могли бы использовать отражение, но, похоже, вам оно не нужно так сильно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...