void InitializeDynamicMember(M4uBindingObject bo, M4uBindingMember bm) { if (bm.BindObject == null) { return; } var memberNames = bm.MemberPath.Replace('.', '/').Split('/'); var @object = bm.BindObject; for (var i = 1; i < memberNames.Length; i++) { var isLast = (i == memberNames.Length - 1); var memberName = memberNames[i]; var objectType = @object.GetType(); if (isLast) { var memberInfos = objectType.GetMember(memberName, bo.BindingFlags); if (memberInfos != null && memberInfos.Length >= 1) { var memberType = memberInfos[0].MemberType; if (memberType == MemberTypes.Field) { bm.SetDynamicObject(M4uMemberType.Field, memberName, @object); } else if (memberType == MemberTypes.Property) { bm.SetDynamicObject(M4uMemberType.Property, memberName, @object); } } } else { var nowObject = default(object); if (bo.IsGetProperty) { var propertyInfo = objectType.GetProperty(memberName, bo.BindingFlags); nowObject = propertyInfo?.GetValue(@object); } if (bo.IsGetField && nowObject == null) { var fieldInfo = objectType.GetField(memberName, bo.BindingFlags); nowObject = fieldInfo?.GetValue(@object); } if (nowObject == null) { break; } @object = nowObject; } } }
void LoadMembers(M4uBindingObject bo, Object @object) { if (bo.IsNotifierOnly && !(@object is IM4uNotifier)) { return; } if (bo.IsDynamicBinding) { return; } var objectType = @object.GetType(); var objectName = objectType.Name; var memberInfos = objectType.GetMembers(bo.BindingFlags); foreach (var memberInfo in memberInfos) { var memberType = M4uMemberType.None; if (memberInfo.MemberType == MemberTypes.Field) { if (!bo.IsGetField) { continue; } memberType = M4uMemberType.Field; } else if (memberInfo.MemberType == MemberTypes.Property) { if (!bo.IsGetProperty) { continue; } memberType = M4uMemberType.Property; } else { continue; } var memberName = memberInfo.Name; var memberPath = $"{objectName}/{memberName}"; var member = new M4uBindingMember(memberPath, memberType, @object, memberName); bo.Members.Add(member); } }
void InitializeDynamicObject(M4uBindingObject bo, M4uBindingMember bm) { var memberNames = bm.MemberPath.Replace('.', '/').Split('/'); var componentName = memberNames[0]; var transform = this.transform; var @object = default(object); do { var component = transform.GetComponent(componentName); if (component != null && (!bo.IsNotifierOnly || component is IM4uNotifier)) { @object = component; break; } transform = transform.parent; }while(transform != null && !bo.IsOwnGameObjectOnly); bm.BindObject = @object; bm.MemberName = memberNames.Last(); }