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