示例#1
0
    private static object Draw(Type type, object data, int space = 0)
    {
        if (CheckAttribute(type, ref data, space))
        {
            return(data);
        }
        var    attrName = type.GetCustomAttribute <InspectorNameAttribute>();
        string des      = attrName == null ? type.Name : attrName.displayName;

        if (!Draw_Breviary(data, des, space))
        {
            return(data);
        }
        space += SPACE_COUNT;
        Dictionary <string, FieldInfo> infos = ReflectHelper.GetFields(type);

        foreach (var item in infos)
        {
            object fdata = item.Value.GetValue(data);
            if (IsBaseType(item.Value.FieldType))
            {
                DrawBaseField(item.Value, ref fdata, space);
            }
            else if (item.Value.FieldType.IsGenericType)
            {
                Type[] types = item.Value.FieldType.GenericTypeArguments;
                if (types.Length == 1 && item.Value.FieldType == TypeList.MakeGenericType(types))
                {
                    var        method = DrawListMethod;
                    MethodInfo draw   = method.MakeGenericMethod(types);
                    attrName = item.Value.GetCustomAttribute <InspectorNameAttribute>();
                    des      = attrName == null ? item.Value.FieldType.Name : attrName.displayName;
                    draw.Invoke(null, new object[] { fdata, des, space });
                }
                else if (types.Length == 2 && item.Value.FieldType == TypeDict.MakeGenericType(types))
                {
                    var        method = DrawDictMethod;
                    MethodInfo draw   = method.MakeGenericMethod(types);
                    attrName = item.Value.GetCustomAttribute <InspectorNameAttribute>();
                    des      = attrName == null ? item.Value.FieldType.Name : attrName.displayName;
                    draw.Invoke(null, new object[] { fdata, des, space });
                }
            }
            else if (item.Value.FieldType.IsClass)
            {
                if (fdata == null)
                {
                    EditorGUILayout.BeginHorizontal();
                    GUILayout.Space(space);
                    if (GUILayout.Button("Create"))
                    {
                        fdata = type.Assembly.CreateInstance(type.FullName);
                    }
                    EditorGUILayout.EndHorizontal();
                }
                else
                {
                    Draw(item.Value.FieldType, fdata, space);
                }
            }
            item.Value.SetValue(data, fdata);
        }
        return(data);
    }