// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 // // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 // // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! using System.Dynamic; namespace Admin.NET.Core; /// /// 字典扩展方法 /// public static class DictionaryExtensions { /// /// 使用给定的键从字典中获取值。如果找不到,则返回默认值 /// /// 键的类型 /// 值的类型 /// 要检查和获取的字典 /// 要查找值的键 /// 如果找到,返回值;如果找不到,返回默认值 public static TValue? GetOrDefault(this Dictionary dictionary, TKey key) where TKey : notnull { return dictionary.GetValueOrDefault(key); } /// /// 使用给定的键从字典中获取值。如果找不到,则返回默认值 /// /// 键的类型 /// 值的类型 /// 要检查和获取的字典 /// 要查找值的键 /// 如果找到,返回值;如果找不到,返回默认值 public static TValue? GetOrDefault(this IDictionary dictionary, TKey key) { return dictionary.TryGetValue(key, out var obj) ? obj : default; } /// /// 使用给定的键从只读字典中获取值。如果找不到,则返回默认值 /// /// 键的类型 /// 值的类型 /// 要检查和获取的只读字典 /// 要查找值的键 /// 如果找到,返回值;如果找不到,返回默认值 public static TValue? GetOrDefault(this IReadOnlyDictionary dictionary, TKey key) { return dictionary.GetValueOrDefault(key); } /// /// 使用给定的键从并发字典中获取值。如果找不到,则返回默认值 /// /// 键的类型,不能为空 /// 值的类型 /// 要检查和获取的并发字典 /// 要查找值的键 /// 如果找到,返回值;如果找不到,返回默认值 public static TValue? GetOrDefault(this ConcurrentDictionary dictionary, TKey key) where TKey : notnull { return dictionary.GetValueOrDefault(key); } /// /// 使用给定的键从字典中获取值。如果找不到,则使用工厂方法创建并添加值 /// /// 键的类型 /// 值的类型 /// 要检查和获取的字典 /// 要查找值的键 /// 如果字典中未找到,则用于创建值的工厂方法 /// 如果找到,返回值;如果找不到,使用工厂方法创建并返回默认值 public static TValue GetOrAdd(this IDictionary dictionary, TKey key, Func factory) { return dictionary.TryGetValue(key, out var obj) ? obj : dictionary[key] = factory(key); } /// /// 使用给定的键从字典中获取值。如果找不到,则使用工厂方法创建并添加值 /// /// 键的类型 /// 值的类型 /// 要检查和获取的字典 /// 要查找值的键 /// 如果字典中未找到,则用于创建值的工厂方法 /// 如果找到,返回值;如果找不到,使用工厂方法创建并返回默认值 public static TValue GetOrAdd(this IDictionary dictionary, TKey key, Func factory) { return dictionary.GetOrAdd(key, _ => factory()); } /// /// 使用给定的键从并发字典中获取值。如果找不到,则使用工厂方法创建并添加值 /// /// 键的类型,不能为空 /// 值的类型 /// 要检查和获取的并发字典 /// 要查找值的键 /// 如果并发字典中未找到,则用于创建值的工厂方法 /// 如果找到,返回值;如果找不到,使用工厂方法创建并返回默认值 public static TValue GetOrAdd(this ConcurrentDictionary dictionary, TKey key, Func factory) where TKey : notnull { return dictionary.GetOrAdd(key, _ => factory()); } /// /// 将字典转换为动态对象,以便在运行时添加和移除 /// /// 要转换的字典对象 /// 如果值正确,返回表示对象的 ExpandoObject public static dynamic ConvertToDynamicObject(this Dictionary dictionary) { ExpandoObject expandoObject = new(); ICollection> expendObjectCollection = expandoObject!; foreach (var keyValuePair in dictionary) { expendObjectCollection.Add(keyValuePair); } return expandoObject; } /// /// 如果字典中存在指定的键,则尝试获取其值 /// /// 值的类型 /// 字典对象 /// 要查找的键 /// 键对应的值,如果键不存在,则为默认值 /// 如果字典中存在该键,则返回真(True);否则返回假(False) public static bool TryGetValue(this IDictionary dictionary, string key, out T? value) { if (dictionary.TryGetValue(key, out var valueObj) && valueObj is T t) { value = t; return true; } value = default; return false; } /// /// 字典根据 key 删除,返回一个新的字典 /// /// /// /// 移除后新的字典 public static IDictionary RemoveByKeys(this IDictionary dictionary, params string[] keys) { ArgumentNullException.ThrowIfNull(dictionary); if (keys.Length == 0) { return dictionary; } // 创建一个新的字典,避免修改原始字典 var newDic = new Dictionary(dictionary); foreach (var key in keys) { newDic.Remove(key); } return newDic; } }