public static void InitControl(IEditorControl ctrl)
        {
            Type   type = ctrl.GetType();
            string path = $"Assets/Editor/ControlXmls/{type.Name}.xml";

            try
            {
                TextAsset ass = AssetDatabase.LoadAssetAtPath <TextAsset>(path);
                if (ass == null)
                {
                    (ctrl as EditorControl)?.InitFinish();
                    return;
                }

                XmlDocument doc = new XmlDocument();
                doc.LoadXml(ass.text);

                XmlNode root = doc.ChildNodes[0];
                TreeDeserialize(ctrl, root, ctrl);
                AttributeDeserialize(root, ctrl, ctrl);
                (ctrl as EditorControl)?.InitFinish();
            }
            catch (Exception err)
            {
                Log.Error($"解析{type.Name}时候错误, {err}");
            }
        }
        private static void AttributeDeserialize(XmlNode node, IEditorControl ctrl, IEditorControl root)
        {
            Type type = ctrl.GetType();

            MemberInfo[] infos = type.GetMembers(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
            foreach (MemberInfo info in infos)
            {
                object       data;
                XmlAttribute attr = node.Attributes[info.Name];
                if (attr == null)
                {
                    continue;
                }
                switch (info.MemberType)
                {
                case MemberTypes.Field:
                    data = DeserializeXML(node.Attributes[info.Name], root);
                    (info as FieldInfo).SetValue(ctrl, data);
                    break;

                case MemberTypes.Property:
                    data = DeserializeXML(node.Attributes[info.Name], root);
                    (info as PropertyInfo).SetValue(ctrl, data);
                    break;
                }
            }
        }
Exemple #3
0
        public object Deserialize(XmlAttribute data, IEditorControl ctrl)
        {
            Type       type = ctrl.GetType();
            MethodInfo info = type.GetMethod(data.InnerText, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

            if (info == null)
            {
                return(null);
            }

            ParameterExpression p = Expression.Parameter(typeof(EditorControl));
            var cons = Expression.Constant(ctrl);
            MethodCallExpression mcExpr = Expression.Call(cons, info, p);
            Expression <Action <EditorControl> > expr = Expression.Lambda <Action <EditorControl> >(mcExpr, p);
            var v = expr.Compile();

            return(v);
        }
        public static void TreeDeserialize(IEditorControl parent, XmlNode parentNode, IEditorControl root)
        {
            foreach (XmlNode node in parentNode)
            {
                try
                {
                    EditorControl subCtrl = Activator.CreateInstance(typeof(IEditorControl).Assembly.GetType(node.Name)) as EditorControl;
                    subCtrl.SetParent(parent);
                    InitControl(subCtrl);
                    AttributeDeserialize(node, subCtrl, root);

                    Type type = root.GetType();
                    if (!string.IsNullOrEmpty(subCtrl.Name))
                    {
                        MemberInfo[] infos = type.GetMember(subCtrl.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
                        if (infos.Length > 0)
                        {
                            MemberInfo info = infos[0];
                            switch (info.MemberType)
                            {
                            case MemberTypes.Field:
                                (info as FieldInfo).SetValue(root, subCtrl);
                                break;

                            case MemberTypes.Property:
                                (info as PropertyInfo).SetValue(root, subCtrl);
                                break;
                            }
                        }

                        TreeDeserialize(subCtrl, node, root);
                    }
                }
                catch (Exception err)
                {
                    throw new Exception($"{node.Name}", err);
                }
            }
        }
Exemple #5
0
        public void SetEditor(IEditorControl editor)
        {
            try
            {
                _editor           = editor;
                tsbSearch.Visible = editor.SupportSearch;
                tscbKeyValue.Items.Clear();
                object[] skeys = editor.SearchKeys;
                if (skeys != null)
                {
                    tscbKeyValue.Items.AddRange(skeys);
                }

                dOpen.Filter = editor.OpenFileFilter;
                dSave.Filter = editor.SaveFileFilter;
                UpdateFileTitle();
                UpdateSearchBarVisibility();
                editor.DirtyChanged = _ => { UpdateFileTitle(); };
                if (_editor is Control c)
                {
                    c.Enabled = true;
                }

                EditorChanged?.Invoke(editor);
            }
            catch (Exception e)
            {
                MessageBox.Show("Error encountered when setting up editor '{0}'.\n\nException: {1}\nMessage: {2}".F(_editor.GetType().Name, e.GetType(), e.Message), "Dune 2000 Editor", MessageBoxButtons.OK);
                _editor = null;
            }
        }