/src/LinFu.AOP/ImplementModifiableType.cs

http://github.com/philiplaureano/LinFu · C# · 52 lines · 38 code · 11 blank · 3 comment · 2 complexity · 23ef133a9aaa80c062b16bcb8ac31c8f MD5 · raw file

  1. using System;
  2. using LinFu.AOP.Interfaces;
  3. using LinFu.Reflection.Emit;
  4. using Mono.Cecil;
  5. namespace LinFu.AOP.Cecil
  6. {
  7. internal class ImplementModifiableType : ImplementMethodReplacementHost
  8. {
  9. private TypeReference _modifiableInterfaceType;
  10. public ImplementModifiableType(Func<TypeReference, bool> filter)
  11. : base(filter)
  12. {
  13. }
  14. public override void ImportReferences(ModuleDefinition module)
  15. {
  16. // Import the references from the base class
  17. base.ImportReferences(module);
  18. _modifiableInterfaceType = module.ImportType<IModifiableType>();
  19. }
  20. public override bool ShouldWeave(TypeDefinition item)
  21. {
  22. var shouldWeave = base.ShouldWeave(item);
  23. // Make sure that the IModifiableType interface is only implemented once
  24. shouldWeave &= !item.Interfaces.Contains(_modifiableInterfaceType);
  25. var isStaticClass = item.IsAbstract && item.IsSealed;
  26. shouldWeave &= !isStaticClass;
  27. return shouldWeave;
  28. }
  29. public override void Weave(TypeDefinition item)
  30. {
  31. base.Weave(item);
  32. // Implement IModifiableType
  33. if (item.Interfaces.Contains(_modifiableInterfaceType))
  34. return;
  35. item.Interfaces.Add(_modifiableInterfaceType);
  36. item.AddProperty("IsInterceptionDisabled", typeof(bool));
  37. item.AddProperty("AroundMethodCallProvider", typeof(IAroundInvokeProvider));
  38. item.AddProperty("AroundMethodBodyProvider", typeof(IAroundInvokeProvider));
  39. }
  40. }
  41. }