public static void ApplyBindingsRecursive(IBindable obj) { var type = obj.GetType(); // if it has children (f.e. BindableList) we forward all their events and child events to if (obj is IBindableContainer) { foreach (var child in ((IBindableContainer)obj).GetBindableChildren()) { ApplyBindingsRecursive(child); } } // go through all field an look for the [CreateBindable] attribute var fields = type.GetFields(); foreach (var field in fields) { var fieldValue = field.GetValue(obj); if (field.GetCustomAttributes(typeof(BindableAttribute), true).Any()) { var castedfieldValue = (IBindable)fieldValue; obj.ForwardOnChange(castedfieldValue); // UnityEngine.Debug.Log("forwarding from field '" + field.Name + "' " + castedfieldValue.GetType().Name + " to " + obj.GetType().Name); ApplyBindingsRecursive(castedfieldValue); } } }
/// <summary> /// <see cref="CreateObjectRecursive{T}"/> /// </summary> /// <param name="type"></param> /// <param name="parent"></param> /// <returns></returns> protected static IBindable CreateObjectRecursive(Type type, IBindable parent) { // some debug output // UnityEngine.Debug.Log("Trying to create type: " + type.FullName + " isGeneric:" + type.IsGenericType); // if (type.IsGenericType) // { // UnityEngine.Debug.Log("It is a generic type: " + type.GetGenericArguments()[0].ToString()); // } // create the objects instance var constructor = type.GetConstructor(Type.EmptyTypes); var obj = constructor.Invoke(null); // the object to be created must implement IBindable if (!(obj is IBindable)) { throw new BindableException("All objects created by BindableFactory must implement the interface IBindable but " + type.Name + " does not!"); } var objCasted = (IBindable)obj; // if the object has a parent then forward the events to the parent if (parent != null) { parent.ForwardOnChange(objCasted); } // go through all field an look for the [CreateBindable] attribute var fields = type.GetFields(); foreach (var field in fields) { if (field.GetCustomAttributes(typeof(BindableAttribute), true).Any()) { var childObj = CreateObjectRecursive(field.FieldType, objCasted); field.SetValue(objCasted, childObj); } } return(objCasted); }