/// <summary> /// 创建一个数组元素自定义的ArrayElement /// </summary> /// <param name="customerAttribute"></param> /// <param name="depth"></param> /// <returns></returns> public InspectorElement CreateCustomerArrayElemnet(CustomerElementAttribute customerAttribute, int depth) { InspectorElement element = Activator.CreateInstance(typeof(ArrayElement), customerAttribute) as InspectorElement; element.Inspector = this; element.Depth = depth; return(element); }
/// <summary> /// 通过UI类型获取UIItem /// </summary> /// <param name="elementType"></param> /// <param name="drawerParent"></param> /// <returns></returns> public InspectorElement CreateDrawerForType(Type elementType, int depth, params object[] args) { InspectorElement element = Activator.CreateInstance(elementType, args) as InspectorElement; element.Inspector = this; element.Depth = depth; return(element); }
/// <summary> /// 绑定UI /// </summary> /// <param name="parent">UI</param> /// <param name="member">成员</param> /// <param name="variableName">变量名称</param> public void BindTo(InspectorElement parent, MemberInfo member, string proertyName) { string variableName = proertyName; if (member is FieldInfo field) { if (variableName == null) { variableName = field.Name; } if (!field.FieldType.IsValueType) { BindTo(field.FieldType, variableName, () => field.GetValue(parent.Value), (value) => { field.SetValue(parent.Value, value); }); } else { BindTo(field.FieldType, variableName, () => field.GetValue(parent.Value), (value) => { field.SetValue(parent.Value, value); parent.Value = parent.Value; // 这一步是为了将struct的值不断向上一级传递 }); } } else if (member is PropertyInfo property) { if (variableName == null) { variableName = property.Name; } if (!property.PropertyType.IsValueType) { BindTo(property.PropertyType, variableName, () => property.GetValue(parent.Value, null), (value) => { property.SetValue(parent.Value, value, null); }); } else { BindTo(property.PropertyType, variableName, () => property.GetValue(parent.Value, null), (value) => { property.SetValue(parent.Value, value, null); parent.Value = parent.Value; }); } } else { throw new ArgumentException("Member can either be a field or a property"); } }
protected override void CreateElements() { if (Value == null) { return; } if (IsArray) { Array array = (Array)Value; for (int i = 0; i < array.Length; i++) { InspectorElement elementDrawer = CreateDrawerForMemberType(); if (elementDrawer == null) { break; } int index = i; elementDrawer.BindTo(elementType, "Element " + i, () => ((Array)Value).GetValue(index), (value) => { Array _array = (Array)Value; _array.SetValue(value, index); Value = _array; }); elementDrawer.Refresh(); elementsContent.Add(elementDrawer); } } else { IList list = (IList)Value; for (int i = 0; i < list.Count; i++) { InspectorElement elementDrawer = CreateDrawerForMemberType(); if (elementDrawer == null) { break; } int j = i; elementDrawer.BindTo(elementType, "Element " + i, () => ((IList)Value)[j], (value) => { IList _list = (IList)Value; _list[j] = value; Value = _list; }); elementDrawer.Refresh(); elementsContent.Add(elementDrawer); } } }