using System.Reflection; using JNPF.DependencyInjection; namespace JNPF.Common.Extension; /// /// 字典辅助扩展方法. /// [SuppressSniffer] public static class DictionaryExtensions { /// /// 从字典中获取值,不存在则返回字典类型的默认值. /// /// 字典键类型. /// 字典值类型. /// 要操作的字典. /// 指定键名. /// 获取到的值. public static TValue GetOrDefault(this IDictionary dictionary, TKey key) { return dictionary.TryGetValue(key, out TValue value) ? value : default(TValue); } /// /// 获取指定键的值,不存在则按指定委托添加值. /// /// 字典键类型. /// 字典值类型. /// 要操作的字典. /// 指定键名. /// 添加值的委托. /// 获取到的值. public static TValue GetOrAdd(this IDictionary dictionary, TKey key, Func addFunc) { if (dictionary.TryGetValue(key, out TValue value)) { return value; } return dictionary[key] = addFunc(); } /// /// 替换值. /// /// /// public static void ReplaceValue(this Dictionary dictionary1, Dictionary dictionary2) { foreach (var item in dictionary2.Keys) { if (dictionary1.ContainsKey(item)) { dictionary1[item] = dictionary2[item]; } } } private static Dictionary dicProperties = new Dictionary(StringComparer.OrdinalIgnoreCase); /// /// 字典转换成指定类型实例 /// added by ly on 20230524 /// /// 转换的目标类型 /// 被转换的字典 /// 转换后的目标类型对象实例 public static T ToObject(this Dictionary dictionary) where T : class, new() { var name = typeof(T).Name; T instance = new(); if (!dicProperties.TryGetValue(name, out string[] properies)) { properies = instance.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).Select(p => p.Name).ToArray(); dicProperties[name] = properies; } foreach (var pn in properies) { if (dictionary.ContainsKey(pn)) { instance.PropertySetValue(pn, dictionary[pn]); } } return instance; } }