Files
BABA_YAGA/Packages/app.rive.rive-unity/Editor/Components/Utils/ReflectionUtils.cs
2026-05-19 17:39:03 +07:00

116 lines
3.9 KiB
C#

using System;
using System.Reflection;
using Rive.EditorTools;
using UnityEditor;
namespace Rive.Utils
{
internal static class ReflectionUtils
{
private const BindingFlags DefaultBindingFlags =
BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
public static bool TryGetBoolValue(object target, string memberName, out bool value)
{
value = false;
if (target == null || string.IsNullOrEmpty(memberName)) return false;
try
{
var type = target.GetType();
var field = type.GetField(memberName, DefaultBindingFlags);
if (field != null)
{
value = (bool)field.GetValue(target);
return true;
}
var prop = type.GetProperty(memberName, DefaultBindingFlags);
if (prop != null)
{
value = (bool)prop.GetValue(target);
return true;
}
var method = type.GetMethod(memberName, DefaultBindingFlags);
if (method != null)
{
value = (bool)method.Invoke(target, null);
return true;
}
return false;
}
catch (Exception e)
{
DebugLogger.Instance.LogError($"Error getting bool value for member '{memberName}': {e.Message}");
return false;
}
}
public static bool TryGetValue<T>(object target, string memberName, out T value)
{
value = default;
if (target == null || string.IsNullOrEmpty(memberName)) return false;
try
{
var type = target.GetType();
var field = type.GetField(memberName, DefaultBindingFlags);
if (field != null)
{
value = (T)field.GetValue(target);
return true;
}
var prop = type.GetProperty(memberName, DefaultBindingFlags);
if (prop != null)
{
value = (T)prop.GetValue(target);
return true;
}
var method = type.GetMethod(memberName, DefaultBindingFlags);
if (method != null)
{
value = (T)method.Invoke(target, null);
return true;
}
return false;
}
catch (Exception e)
{
DebugLogger.Instance.LogError($"Error getting value of type {typeof(T)} for member '{memberName}': {e.Message}");
return false;
}
}
/// <summary>
/// Get the display name for a serialized property. This accounts for a custom label being set via an InspectorFieldAttribute.
/// </summary>
/// <param name="property"> The property to get the label for. </param>
/// <returns> The display name for the property. </returns>
public static string GetPropertyLabel(SerializedProperty property)
{
if (property == null) return string.Empty;
try
{
var target = property.serializedObject.targetObject;
var fieldInfo = target.GetType().GetField(property.name, DefaultBindingFlags);
var inspectorAttr = fieldInfo?.GetCustomAttribute<InspectorFieldAttribute>();
return inspectorAttr?.DisplayName ?? ObjectNames.NicifyVariableName(property.name);
}
catch (Exception e)
{
DebugLogger.Instance.LogError($"Error getting label for property '{property.name}': {e.Message}");
return ObjectNames.NicifyVariableName(property.name);
}
}
}
}