ReferenceHolder.cs 1.4 KB

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