UnityMethodDrawer.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using Chronos.Controls.Editor;
  6. using Chronos.Reflection.Internal;
  7. using UnityEditor;
  8. namespace Chronos.Reflection.Editor
  9. {
  10. [CustomPropertyDrawer(typeof(UnityMethod))]
  11. public class UnityMethodDrawer : UnityMemberDrawer<UnityMethod>
  12. {
  13. #region Filtering
  14. /// <inheritdoc />
  15. protected override FilterAttribute DefaultFilter()
  16. {
  17. FilterAttribute filter = base.DefaultFilter();
  18. // Override defaults here
  19. return filter;
  20. }
  21. // Do not edit below
  22. /// <inheritdoc />
  23. protected override MemberTypes validMemberTypes
  24. {
  25. get
  26. {
  27. return MemberTypes.Method;
  28. }
  29. }
  30. /// <inheritdoc />
  31. protected override bool ValidateMember(MemberInfo member)
  32. {
  33. bool valid = base.ValidateMember(member);
  34. valid &= UnityMemberDrawerHelper.ValidateMethod(filter, (MethodInfo)member);
  35. return valid;
  36. }
  37. #endregion
  38. #region Fields
  39. /// <summary>
  40. /// The UnityMethod.parameterTypes of the inspected property, of type Type[].
  41. /// </summary>
  42. protected SerializedProperty parameterTypesProperty;
  43. protected override void Update(SerializedProperty property)
  44. {
  45. base.Update(property);
  46. parameterTypesProperty = property.FindPropertyRelative("_parameterTypes");
  47. }
  48. #endregion
  49. #region Value
  50. /// <inheritdoc />
  51. protected override void SetValue(UnityMethod value)
  52. {
  53. base.SetValue(value);
  54. UnityMemberDrawerHelper.SerializeParameterTypes(parameterTypesProperty, value != null ? value.parameterTypes : null);
  55. }
  56. /// <inheritdoc />
  57. protected override UnityMethod BuildValue(string component, string name)
  58. {
  59. return new UnityMethod(component, name, UnityMemberDrawerHelper.DeserializeParameterTypes(parameterTypesProperty));
  60. }
  61. /// <inheritdoc />
  62. protected override bool hasMultipleDifferentValues
  63. {
  64. get
  65. {
  66. if (base.hasMultipleDifferentValues)
  67. {
  68. return true;
  69. }
  70. return UnityMemberDrawerHelper.ParameterTypesHasMultipleValues(parameterTypesProperty);
  71. }
  72. }
  73. #endregion
  74. #region Reflection
  75. protected override List<DropdownOption<UnityMethod>> GetMemberOptions(Type type, string component = null)
  76. {
  77. var methods = base.GetMemberOptions(type, component);
  78. if (filter.Extension)
  79. {
  80. var extensionMethods = type.GetExtensionMethods()
  81. .Where(ValidateMember)
  82. .Select(method => GetMemberOption(method, component, method.GetParameters()[0].ParameterType != type));
  83. methods.AddRange(extensionMethods);
  84. }
  85. return methods;
  86. }
  87. protected override DropdownOption<UnityMethod> GetMemberOption(MemberInfo member, string component, bool inherited)
  88. {
  89. UnityMethod value;
  90. string label;
  91. if (member is MethodInfo)
  92. {
  93. MethodInfo method = (MethodInfo)member;
  94. ParameterInfo[] parameters = method.GetParameters();
  95. value = new UnityMethod(component, member.Name, parameters.Select(p => p.ParameterType).ToArray());
  96. string parameterString = string.Join(", ", parameters.Select(p => p.ParameterType.PrettyName()).ToArray());
  97. label = string.Format("{0} {1} ({2})", method.ReturnType.PrettyName(), member.Name, parameterString);
  98. }
  99. else
  100. {
  101. throw new ArgumentException("Invalid member information type.");
  102. }
  103. if (inherited)
  104. {
  105. label = "Inherited/" + label;
  106. }
  107. return new DropdownOption<UnityMethod>(value, label);
  108. }
  109. #endregion
  110. /// <inheritdoc />
  111. protected override string memberLabel
  112. {
  113. get
  114. {
  115. return "Method";
  116. }
  117. }
  118. }
  119. }