Как создать проверку аспекта для нулевых ссылок во всех методах класса в postsharp - PullRequest
0 голосов
/ 04 ноября 2008

Как создать проверку аспекта для нулевых ссылок во всех методах класса в 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
        }
    }
}

Аспект [MethodParameterNullCheck] должен затем развернуться к следующему коду:

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
        }
    }
}

Буду признателен, если вы можете дать мне пример реализации этого, чтобы я начал работать с AOP с postsharp.

1 Ответ

3 голосов
/ 04 ноября 2008

Альтернативным подходом является метод расширения:

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

затем позвоните:

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

T : class предотвращает нас случайно бокса и т. Д.

Re AOP; У Джона Скита есть образец для чего-то похожего здесь - но охватывающего один метод / параметр.

Вот воспроизводимый аспект; обратите внимание, что этот аспект охватывает только 1 аргумент за раз и зависит от метода, но в целом я бы сказал, что это вполне разумно ... однако, вы, вероятно, можете изменить его.

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);
            }
        }
    }
}
...