using System; using System.Linq.Expressions; using UnityEditor; namespace Cinemachine.Editor { public static class SerializedPropertyHelper { /// This is a way to get a field name string in such a manner that the compiler will /// generate errors for invalid fields. Much better than directly using strings. /// Usage: instead of /// /// "m_MyField"; /// /// do this: /// /// MyClass myclass = null; /// SerializedPropertyHelper.PropertyName( () => myClass.m_MyField); /// public static string PropertyName(Expression> exp) { var body = exp.Body as MemberExpression; if (body == null) { var ubody = (UnaryExpression)exp.Body; body = ubody.Operand as MemberExpression; } return body.Member.Name; } /// Usage: instead of /// /// mySerializedObject.FindProperty("m_MyField"); /// /// do this: /// /// MyClass myclass = null; /// mySerializedObject.FindProperty( () => myClass.m_MyField); /// public static SerializedProperty FindProperty(this SerializedObject obj, Expression> exp) { return obj.FindProperty(PropertyName(exp)); } /// Usage: instead of /// /// mySerializedProperty.FindPropertyRelative("m_MyField"); /// /// do this: /// /// MyClass myclass = null; /// mySerializedProperty.FindPropertyRelative( () => myClass.m_MyField); /// public static SerializedProperty FindPropertyRelative(this SerializedProperty obj, Expression> exp) { return obj.FindPropertyRelative(PropertyName(exp)); } } }