2011-07-24 21 views
12

¿Es posible recorrer los argumentos de una función para verificar si alguno de ellos es nulo (o verificarlos mediante otra función personalizada)? algo como esto:C# - Uso de foreach para recorrer los argumentos del método

public void test (string arg1, string arg2, object arg3, DataTable arg4) 
{ 
    foreach (var item in argus) 
     { 
      if(item == null) 
      { 
       throw; 
      } 
     } 
    // do the rest... 
} 

¿cuál es la palabra clave correcta para "Argus"? Sé que esto es posible gracias a un poco más si la declaración pero en busca de una manera más rápida ...

+0

Creo que tendrás que mirar en la reflexión. Lo que estás tratando de hacer no parece valer la pena en comparación con el enfoque directo (que es bastante fácil con cortar y pegar). – hatchet

+0

Esto es posible hacerlo de manera directa en lenguajes dinámicos y en idiomas tipados estáticamente con soporte de metaprogramación. Por ejemplo, Nemerle tiene la palabra clave NotNull en su diseño predeterminado por biblioteca de contrato. –

+0

Recomiendo encarecidamente comprobar cada uno individualmente y arrojar una ArgumentNullException con el nombre del parámetro específico. Puede escribir cada cheque y lanzar en una sola línea, minimizando la hinchazón del código. Esto proporciona retroalimentación más específica y no toma mucho tiempo para escribir. Puede usar un fragmento si desea ahorrar tiempo y la mayoría de las herramientas de productividad tienen una forma de insertar este código (por ejemplo, ReSharper puede insertar las comprobaciones con unas pocas pulsaciones de teclado por parámetro). Incluso con 'vanilla' Visual Studio, Autocompletar hace que escribir esto a mano requiera un mínimo de teclas. –

Respuesta

6

Te supongo que no quieren cambiar a cada método en params su proyecto (s). Puede utilizar PostSharp, pero hay otros métodos, depende de su marco.

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/ para obtener PostSharp, también se pueden encontrar doc allí.

+1

Pregunta: ¿Qué es AOP? – Sam

+0

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

+0

+1 para una buena solución AOP, de esta manera puedes lanzar ArgumentNullException con el nombre correcto, si solo MS lo agregara a .Net ... –

5

Si desea una manera fácil de bucle a través de argumentos, usted debe pensar en usar la palabra clave params

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

Aparte de eso, podría usar el reflejo, pero parece que no lo necesita tan mal

13

Puede usar la palabra clave params para recorrer todos los argumentos pero luego usaría su tipo en el método mismo. Escribiría una función de utilidad que busca null.

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

Puede llamar a este en el inicio de su método como

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

La forma LINQ:

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