ReferenceHolder.cs 986 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using System;
  2. namespace Urho
  3. {
  4. internal class ReferenceHolder<T> where T : class
  5. {
  6. public T StrongRef { get; private set; }
  7. public WeakReference<T> WeakRef { get; private set; }
  8. public ReferenceHolder(T obj, bool weak)
  9. {
  10. if (weak)
  11. WeakRef = new WeakReference<T>(obj);
  12. else
  13. StrongRef = obj;
  14. }
  15. public T Reference
  16. {
  17. get
  18. {
  19. if (StrongRef != null)
  20. return StrongRef;
  21. T wr;
  22. WeakRef.TryGetTarget(out wr);
  23. return wr;
  24. }
  25. }
  26. /// <summary>
  27. /// Change Weak to Strong
  28. /// </summary>
  29. public bool MakeStrong()
  30. {
  31. if (StrongRef != null)
  32. return true;
  33. T strong = null;
  34. WeakRef?.TryGetTarget(out strong);
  35. StrongRef = strong;
  36. WeakRef = null;
  37. return StrongRef != null;
  38. }
  39. /// <summary>
  40. /// Change Strong to Weak
  41. /// </summary>
  42. public bool MakeWeak()
  43. {
  44. if (StrongRef != null)
  45. {
  46. WeakRef = new WeakReference<T>(StrongRef);
  47. StrongRef = null;
  48. return true;
  49. }
  50. return false;
  51. }
  52. }
  53. }