using System.Collections; namespace YLErp.Commons { /// /// /// /// /// public class ExpandoDictionary : IDictionary, IDictionary { readonly IDictionary _dic; public ExpandoDictionary(IDictionary dic) { _dic = dic ?? throw new ArgumentNullException(nameof(dic)); } object IDictionary.this[object key] { get { return ((IDictionary)_dic).Contains(key) ? ((IDictionary)_dic)[(TKey)key] : default; } set => ((IDictionary)_dic)[(TKey)key] = (TValue)value; } public TValue this[TKey key] { get => _dic.TryGetValue(key, out var value) ? value : default; set => _dic[key] = value; } ICollection IDictionary.Keys => _dic.Keys.ToArray(); ICollection IDictionary.Values => _dic.Values.ToArray(); public bool IsReadOnly => _dic.IsReadOnly; bool IDictionary.IsFixedSize => ((IDictionary)_dic).IsFixedSize; public int Count => _dic.Count; object ICollection.SyncRoot => ((IDictionary)_dic).SyncRoot; bool ICollection.IsSynchronized => ((IDictionary)_dic).IsSynchronized; ICollection IDictionary.Keys => _dic.Keys; ICollection IDictionary.Values => _dic.Values; void IDictionary.Add(object key, object value) { ((IDictionary)_dic).Add(key, value); } public void Add(TKey key, TValue value) { _dic.Add(key, value); } public void Add(KeyValuePair item) { _dic.Add(item); } public void Clear() { _dic.Clear(); } bool IDictionary.Contains(object key) { return ((IDictionary)_dic).Contains(key); } public bool Contains(KeyValuePair item) { return _dic.Contains(item); } public bool ContainsKey(TKey key) { return _dic.ContainsKey(key); } void ICollection.CopyTo(Array array, int index) { ((IDictionary)_dic).CopyTo(array, index); } public void CopyTo(KeyValuePair[] array, int arrayIndex) { _dic.CopyTo(array, arrayIndex); } IDictionaryEnumerator IDictionary.GetEnumerator() { return ((IDictionary)_dic).GetEnumerator(); } void IDictionary.Remove(object key) { ((IDictionary)_dic).Remove(key); } public bool Remove(TKey key) { return _dic.Remove(key); } public bool Remove(KeyValuePair item) { return _dic.Remove(item); } public bool TryGetValue(TKey key, out TValue value) { return _dic.TryGetValue(key, out value); } IEnumerator IEnumerable.GetEnumerator() { return _dic.GetEnumerator(); } IEnumerator> IEnumerable>.GetEnumerator() { return _dic.GetEnumerator(); } public static implicit operator ExpandoDictionary(Dictionary dic) { return new ExpandoDictionary(dic); } } /// /// /// public class ExpandoDictionary { public delegate string FormatPropValue(string propName, object propValue); public static ExpandoDictionary ConvertObject(object obj, FormatPropValue format) { if (obj is null) { return null; } var props = TypeDescriptor.GetProperties(obj); var dic = new Dictionary(props.Count); foreach (PropertyDescriptor p in props) { var val = p.GetValue(obj); dic[p.Name] = val == null ? string.Empty : format != null ? format(p.Name, val) : val.ToString(); } return dic; } } }