//------------------------------------------------------------------------------ // 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 // 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 // CSDN博客:https://blog.csdn.net/qq_40374647 // 哔哩哔哩视频:https://space.bilibili.com/94253567 // Gitee源代码仓库:https://gitee.com/RRQM_Home // Github源代码仓库:https://github.com/RRQM // API首页:https://www.yuque.com/rrqm/touchsocket/index // 交流QQ群:234762506 // 感谢您的下载和使用 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ using System; using System.Collections.Generic; namespace TouchSocket.Core { /// /// 转换器 /// public class TouchSocketConverter { private readonly List> m_converters = new List>(); /// /// 添加插件 /// /// 插件 /// public void Add(IConverter converter) { if (converter == null) { throw new ArgumentNullException(); } foreach (var item in m_converters) { if (item.GetType() == converter.GetType()) { return; } } m_converters.Add(converter); m_converters.Sort(delegate (IConverter x, IConverter y) { if (x.Order == y.Order) return 0; else if (x.Order > y.Order) return 1; else return -1; }); } /// /// 清除所有转化器 /// public void Clear() { m_converters.Clear(); } /// /// 将源数据转换目标类型对象 /// /// /// /// public object ConvertFrom(TSource source, Type targetType) { object result; foreach (var item in m_converters) { if (item.TryConvertFrom(source, targetType, out result)) { return result; } } throw new Exception($"{source}无法转换为{targetType}类型。"); } /// /// 将目标类型对象转换源数据 /// /// /// public TSource ConvertTo(object target) { foreach (var item in m_converters) { if (item.TryConvertTo(target, out TSource source)) { return source; } } throw new Exception($"{target}无法转换为{typeof(TSource)}类型。"); } /// /// 移除插件 /// /// public void Remove(IConverter converter) { if (converter == null) { throw new ArgumentNullException(); } m_converters.Remove(converter); } /// /// 移除插件 /// /// public void Remove(Type type) { for (int i = m_converters.Count - 1; i >= 0; i--) { IConverter plugin = m_converters[i]; if (plugin.GetType() == type) { m_converters.RemoveAt(i); } } } } }