/Mono.Cecil/MemberDefinitionCollection.cs

http://github.com/jbevain/cecil · C# · 74 lines · 49 code · 16 blank · 9 comment · 4 complexity · f5945aba6d4168f6913def8ddec4fcb7 MD5 · raw file

  1. //
  2. // Author:
  3. // Jb Evain (jbevain@gmail.com)
  4. //
  5. // Copyright (c) 2008 - 2015 Jb Evain
  6. // Copyright (c) 2008 - 2011 Novell, Inc.
  7. //
  8. // Licensed under the MIT/X11 license.
  9. //
  10. using System;
  11. using Mono.Collections.Generic;
  12. namespace Mono.Cecil {
  13. sealed class MemberDefinitionCollection<T> : Collection<T> where T : IMemberDefinition {
  14. TypeDefinition container;
  15. internal MemberDefinitionCollection (TypeDefinition container)
  16. {
  17. this.container = container;
  18. }
  19. internal MemberDefinitionCollection (TypeDefinition container, int capacity)
  20. : base (capacity)
  21. {
  22. this.container = container;
  23. }
  24. protected override void OnAdd (T item, int index)
  25. {
  26. Attach (item);
  27. }
  28. protected sealed override void OnSet (T item, int index)
  29. {
  30. Attach (item);
  31. }
  32. protected sealed override void OnInsert (T item, int index)
  33. {
  34. Attach (item);
  35. }
  36. protected sealed override void OnRemove (T item, int index)
  37. {
  38. Detach (item);
  39. }
  40. protected sealed override void OnClear ()
  41. {
  42. foreach (var definition in this)
  43. Detach (definition);
  44. }
  45. void Attach (T element)
  46. {
  47. if (element.DeclaringType == container)
  48. return;
  49. if (element.DeclaringType != null)
  50. throw new ArgumentException ("Member already attached");
  51. element.DeclaringType = this.container;
  52. }
  53. static void Detach (T element)
  54. {
  55. element.DeclaringType = null;
  56. }
  57. }
  58. }