2008-11-04 7 views
0

Comment créer un aspect vérifiant les références nulles sur toutes les méthodes d'une classe dans postsharp.Comment créer un aspect vérifiant les références nulles sur toutes les méthodes d'une classe dans postsharp

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace test 
{ 
    [MethodParameterNullCheck] 
    internal class Class 
    { 
     public Class() 
     { 

     } 

     public void MethodA(int i, ClassA a, ClassB b) 
     { 
       //Some business logic 
     } 
    } 
} 

L'aspect [MethodParameterNullCheck] devrait alors se dérouler au code suivant:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace test 
{ 
    [MethodParameterNullCheck] 
    internal class Class 
    { 
     public Class() 
     { 

     } 

     public void MethodA(int i, ClassA a, ClassB b) 
     { 
      if (a == null) throw new ArgumentNullException("Class->MethodA: Argument a of ClassA is not allowed to be null."); 
      if (b == null) throw new ArgumentNullException("Class->MethodA: Argument b of ClassB is not allowed to be null."); 
      // Some Business Logic 
     } 
    } 
} 

Je vais apprécier si vous pouvez me donner un exemple d'implémentation sur ce pour me startet sur AOP avec PostSharp.

Répondre

3

Une autre approche est une méthode d'extension:

public static void ThrowIfNull<T>(this T obj, string parameterName) where T : class 
{ 
    if(obj == null) throw new ArgumentNullException(parameterName); 
} 

puis appelez:

foo.ThrowIfNull("foo"); 
bar.ThrowIfNull("bar"); 

Les T : class nous pervents ints accidentellement boxe, etc.

Re AOP; Jon Skeet a un échantillon pour quelque chose de similaire here - mais couvrant une seule méthode/paramètre.

Voici l'aspect reproduit; Notez que cet aspect couvre seulement 1 argument à la fois, et est spécifique à la méthode, mais en général, je dirais que c'est parfaitement raisonnable ... cependant, vous pourriez probablement le changer.

using System; 
using System.Reflection; 
using PostSharp.Laos; 

namespace IteratorBlocks 
{ 
    [Serializable] 
    class NullArgumentAspect : OnMethodBoundaryAspect 
    { 
     string name; 
     int position; 

     public NullArgumentAspect(string name) 
     { 
      this.name = name; 
     } 

     public override void CompileTimeInitialize(MethodBase method) 
     { 
      base.CompileTimeInitialize(method); 
      ParameterInfo[] parameters = method.GetParameters(); 
      for (int index = 0; index < parameters.Length; index++) 
      { 
       if (parameters[index].Name == name) 
       { 
        position = index; 
        return; 
       } 
      } 
      throw new ArgumentException("No parameter with name " + name); 
     } 

     public override void OnEntry(MethodExecutionEventArgs eventArgs) 
     { 
      if (eventArgs.GetArguments()[position] == null) 
      { 
       throw new ArgumentNullException(name); 
      } 
     } 
    } 
} 
Questions connexes