EntityTreeViewItem.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #if ENABLE_VIEW
  2. using System;
  3. using System.Runtime.CompilerServices;
  4. using Microsoft.CSharp.RuntimeBinder;
  5. using UnityEditor.IMGUI.Controls;
  6. namespace ET
  7. {
  8. public class EntityTreeViewItem: TreeViewItem
  9. {
  10. public Entity entity;
  11. public EntityTreeViewItem(Entity entity, int id)
  12. {
  13. this.entity = entity;
  14. base.id = id;
  15. }
  16. public override string displayName
  17. {
  18. get
  19. {
  20. if(!string.IsNullOrEmpty(_displayName))
  21. {
  22. return _displayName;
  23. }
  24. string name = this.entity.GetType().Name;
  25. string debugger_name = ReadDebuggerDisplay(entity);
  26. _displayName = string.IsNullOrEmpty(debugger_name)? name : $"{name}{debugger_name}";
  27. return _displayName;
  28. }
  29. }
  30. private string _displayName;
  31. // https://stackoverflow.com/a/13650728/37055
  32. private static object ReadProperty(object target, string propertyName)
  33. {
  34. var args = new[] { CSharpArgumentInfo.Create(0, null) };
  35. var binder = Binder.GetMember(
  36. 0,
  37. propertyName,
  38. target.GetType(),
  39. args
  40. );
  41. var site = CallSite<Func<CallSite, object, object>>.Create(binder);
  42. return site.Target(site, target);
  43. }
  44. private static string ReadDebuggerDisplay(object target, string propertyName = "ViewGoName")
  45. {
  46. string debuggerDisplay = string.Empty;
  47. try
  48. {
  49. var value = ReadProperty(target, propertyName) ?? string.Empty;
  50. debuggerDisplay = value as string ?? value.ToString();
  51. }
  52. catch(Exception)
  53. {
  54. // ignored
  55. }
  56. return debuggerDisplay;
  57. }
  58. }
  59. }
  60. #endif