Ejemplo n.º 1
0
        /// <summary>
        /// Weave an aspect on methods matching with a specific pattern
        /// </summary>
        /// <typeparam name="T">Aspect</typeparam>
        /// <param name="pattern">Pattern</param>
        static public void Weave <T>(Func <MethodBase, bool> pattern, GenericWeavingFlags genericWeavingFlags)
            where T : class, IAspect, new()
        {
            var _weaver = new Weaver <T>(pattern, (genericWeavingFlags & NConcern.GenericWeavingFlags.EnableClosedGenericWeaving) != 0);

            lock (Aspect.m_Resource)
            {
                foreach (var _type in Aspect.Explore())
                {
                    if (!_type.IsDefined(typeof(HasNeptuneMethodsAttribute), false))
                    {
                        continue;
                    }
                    if (_type.IsGenericTypeDefinition)
                    {
                        if ((genericWeavingFlags & NConcern.GenericWeavingFlags.EnableOpenGenericWeaving) == 0)
                        {
                            continue;
                        }
                        _weaver.Weave(_type, true);
                    }
                    else
                    {
                        _weaver.Weave(_type, false);
                    }
                }
                if (_weaver.EnableConstructedGenericWeaving)
                {
                    GenericWeavers.Add(_weaver);
                }
            }
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Weave an aspect on a specific method.
 /// </summary>
 /// <typeparam name="T">Aspect</typeparam>
 /// <param name="method">Method</param>
 static public void Weave <T>(MethodBase method, GenericWeavingFlags genericWeavingFlags)
     where T : class, IAspect, new()
 {
     if (method == null)
     {
         throw new ArgumentNullException(nameof(method));
     }
     lock (Aspect.m_Resource)
     {
         var _enableConstructedGenericWeaving = (genericWeavingFlags & NConcern.GenericWeavingFlags.EnableClosedGenericWeaving) != 0;
         var _isGenericDefinition             = method.IsGenericMethodDefinition || method.DeclaringType.IsGenericType;
         if (!_enableConstructedGenericWeaving && _isGenericDefinition)
         {
             throw new InvalidOperationException("Attempting to weave constructed method without using " + nameof(NConcern.GenericWeavingFlags.EnableClosedGenericWeaving));
         }
         Aspect.Directory.Add <T>(method);
     }
 }