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; } } }
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); } } }
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; } }