/// <summary> /// 卸载指定插件树节点对应的自定义对象。 /// </summary> /// <param name="node">指定要卸载对象的挂靠节点。</param> /// <returns>如果成功卸载则返回被卸载的对象,否则返回空(null)。</returns> /// <exception cref="System.ArgumentNullException">当<paramref name="node"/>参数为空(null)。</exception> /// <exception cref="System.ArgumentException">当<paramref name="node"/>参数的<see cref="Zongsoft.Plugins.PluginTreeNode.Tree"/>属性与当前插件树对象不是同一个引用。</exception> /// <remarks> /// <para>注意:当前该方法的实现是不完备的,请谨慎使用!</para> /// <para>将<paramref name="node"/>参数指定的节点对象的Value属性置空,导致该节点类型成为路径节点(即空节点)。</para> /// <para>如果<paramref name="node"/>参数指定的节点对象没有子节点了,则将该节点从插件树中删除,否则保留。</para> /// </remarks> public object Unmount(PluginTreeNode node) { if (node == null) { return(null); } if (!object.ReferenceEquals(node.Tree, this)) { throw new ArgumentException(); } //以永不构建的方式获取当前节点的目标对象 var value = node.UnwrapValue(ObtainMode.Never, null); //将当前节点置空 node.Value = null; //判断当前节点是否为叶子节点,如果是则将其删除 if (node.Children.Count == 0) { node.Remove(); } //返回被卸载的目标对象 return(value); }
public object GetValue(Type valueType, object defaultValue) { if (_valueNode == null) { return(PluginUtility.ResolveValue(_owner, _rawValue, _name, valueType, defaultValue)); } var result = _valueNode.UnwrapValue(ObtainMode.Auto, _owner); if (valueType != null) { result = Zongsoft.Common.Convert.ConvertValue(result, valueType, defaultValue); } return(result); }
private void StopWorkers(PluginTreeNode node) { if (node == null) { return; } foreach (PluginTreeNode child in node.Children) { this.StopWorkers(child); } object target = node.UnwrapValue(ObtainMode.Never); if (target is IWorker worker) { worker.Stop(); } }
private void StartWorkers(PluginTreeNode node, string[] args) { if (node == null) { return; } object target = node.UnwrapValue(ObtainMode.Auto); if (target is IWorker worker && worker.Enabled) { worker.Start(args); } foreach (PluginTreeNode child in node.Children) { this.StartWorkers(child, args); } }