浏览代码

对象属性合并函数

lazy y chen 2 年之前
父节点
当前提交
2f389884ac

+ 325 - 270
Masuit.Tools.Abstractions/Extensions/BaseType/ObjectExtensions.cs

@@ -2,280 +2,335 @@
 using System;
 using System;
 using System.Collections;
 using System.Collections;
 using System.Collections.Generic;
 using System.Collections.Generic;
+using System.Linq;
 using System.Reflection;
 using System.Reflection;
 using Masuit.Tools.Dynamics;
 using Masuit.Tools.Dynamics;
+using Masuit.Tools.Reflection;
 using Newtonsoft.Json.Linq;
 using Newtonsoft.Json.Linq;
 
 
 namespace Masuit.Tools
 namespace Masuit.Tools
 {
 {
-    public static class ObjectExtensions
-    {
-        private static readonly MethodInfo CloneMethod = typeof(object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance);
-
-        public static bool IsPrimitive(this Type type)
-        {
-            if (type == typeof(string))
-            {
-                return true;
-            }
-
-            return type.IsValueType & type.IsPrimitive;
-        }
-
-        public static object DeepClone(this object originalObject)
-        {
-            return InternalCopy(originalObject, new Dictionary<object, object>(new ReferenceEqualityComparer()));
-        }
-
-        public static T DeepClone<T>(this T original)
-        {
-            return (T)DeepClone((object)original);
-        }
-
-        private static object InternalCopy(object originalObject, IDictionary<object, object> visited)
-        {
-            if (originalObject == null)
-            {
-                return null;
-            }
-
-            var typeToReflect = originalObject.GetType();
-            if (IsPrimitive(typeToReflect))
-            {
-                return originalObject;
-            }
-
-            if (visited.ContainsKey(originalObject))
-            {
-                return visited[originalObject];
-            }
-
-            if (typeof(Delegate).IsAssignableFrom(typeToReflect))
-            {
-                return null;
-            }
-
-            var cloneObject = CloneMethod.Invoke(originalObject, null);
-            if (typeToReflect.IsArray)
-            {
-                var arrayType = typeToReflect.GetElementType();
-                if (!IsPrimitive(arrayType))
-                {
-                    Array clonedArray = (Array)cloneObject;
-                    clonedArray.ForEach((array, indices) => array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices));
-                }
-            }
-
-            visited.Add(originalObject, cloneObject);
-            CopyFields(originalObject, visited, cloneObject, typeToReflect);
-            RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect);
-            return cloneObject;
-        }
-
-        private static void RecursiveCopyBaseTypePrivateFields(object originalObject, IDictionary<object, object> visited, object cloneObject, Type typeToReflect)
-        {
-            if (typeToReflect.BaseType != null)
-            {
-                RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect.BaseType);
-                CopyFields(originalObject, visited, cloneObject, typeToReflect.BaseType, BindingFlags.Instance | BindingFlags.NonPublic, info => info.IsPrivate);
-            }
-        }
-
-        private static void CopyFields(object originalObject, IDictionary<object, object> visited, object cloneObject, Type typeToReflect, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy, Func<FieldInfo, bool> filter = null)
-        {
-            foreach (FieldInfo fieldInfo in typeToReflect.GetFields(bindingFlags))
-            {
-                if (filter != null && !filter(fieldInfo))
-                {
-                    continue;
-                }
-
-                if (IsPrimitive(fieldInfo.FieldType) || fieldInfo.IsInitOnly)
-                {
-                    continue;
-                }
-
-                var originalFieldValue = fieldInfo.GetValue(originalObject);
-                var clonedFieldValue = InternalCopy(originalFieldValue, visited);
-                fieldInfo.SetValue(cloneObject, clonedFieldValue);
-            }
-        }
-
-        /// <summary>
-        /// 判断是否为null,null或0长度都返回true
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="value"></param>
-        /// <returns></returns>
-        public static bool IsNullOrEmpty<T>(this T value)
-          where T : class
-        {
-            #region 1.对象级别
-
-            //引用为null
-            bool isObjectNull = value is null;
-            if (isObjectNull)
-            {
-                return true;
-            }
-
-            //判断是否为集合
-            var tempEnumerator = (value as IEnumerable)?.GetEnumerator();
-            if (tempEnumerator == null) return false;//这里出去代表是对象 且 引用不为null.所以为false
-
-            #endregion 1.对象级别
-
-            #region 2.集合级别
-
-            //到这里就代表是集合且引用不为空,判断长度
-            //MoveNext方法返回tue代表集合中至少有一个数据,返回false就代表0长度
-            bool isZeroLenth = tempEnumerator.MoveNext() == false;
-            if (isZeroLenth) return true;
-
-            return isZeroLenth;
-
-            #endregion 2.集合级别
-        }
-
-        /// <summary>
-        /// 转成非null
-        /// </summary>
-        /// <param name="s"></param>
-        /// <param name="value">为空时的替换值</param>
-        /// <returns></returns>
-        public static T IfNull<T>(this T s, T value)
-        {
-            return s ?? value;
-        }
-
-        /// <summary>
-        /// 转换成json字符串
-        /// </summary>
-        /// <param name="obj"></param>
-        /// <param name="setting"></param>
-        /// <returns></returns>
-        public static string ToJsonString(this object obj, JsonSerializerSettings setting = null)
-        {
-            if (obj == null) return string.Empty;
-            return JsonConvert.SerializeObject(obj, setting);
-        }
-
-        /// <summary>
-        /// 链式操作
-        /// </summary>
-        /// <typeparam name="T1"></typeparam>
-        /// <typeparam name="T2"></typeparam>
-        /// <param name="source"></param>
-        /// <param name="action"></param>
-        public static T2 Next<T1, T2>(this T1 source, Func<T1, T2> action)
-        {
-            return action(source);
-        }
-
-        /// <summary>
-        /// 将对象转换成字典
-        /// </summary>
-        /// <param name="value"></param>
-        public static Dictionary<string, string> ToDictionary(this object value)
-        {
-            var dictionary = new Dictionary<string, string>();
-            if (value != null)
-            {
-                foreach (var property in value.GetType().GetProperties())
-                {
-                    var obj = property.GetValue(value, null) ?? string.Empty;
-                    dictionary.Add(property.Name, obj + string.Empty);
-                }
-            }
-
-            return dictionary;
-        }
-
-        /// <summary>
-        /// 将对象转换成字典
-        /// </summary>
-        /// <param name="value"></param>
-        public static Dictionary<string, string> ToDictionary(this JObject value)
-        {
-            var dictionary = new Dictionary<string, string>();
-            if (value != null)
-            {
-                var enumerator = value.GetEnumerator();
-                while (enumerator.MoveNext())
-                {
-                    var obj = enumerator.Current.Value ?? string.Empty;
-                    dictionary.Add(enumerator.Current.Key, obj + string.Empty);
-                }
-            }
-
-            return dictionary;
-        }
-
-        public static dynamic ToDynamic(this object obj)
-        {
-            return DynamicFactory.WithObject(obj);
-        }
-    }
-
-    internal class ReferenceEqualityComparer : EqualityComparer<object>
-    {
-        public override bool Equals(object x, object y)
-        {
-            return ReferenceEquals(x, y);
-        }
-
-        public override int GetHashCode(object obj)
-        {
-            if (obj is null) return 0;
-            return obj.GetHashCode();
-        }
-    }
-
-    internal static class ArrayExtensions
-    {
-        public static void ForEach(this Array array, Action<Array, int[]> action)
-        {
-            if (array.LongLength == 0)
-            {
-                return;
-            }
-
-            ArrayTraverse walker = new ArrayTraverse(array);
-            do action(array, walker.Position);
-            while (walker.Step());
-        }
-
-        internal class ArrayTraverse
-        {
-            public int[] Position;
-            private readonly int[] _maxLengths;
-
-            public ArrayTraverse(Array array)
-            {
-                _maxLengths = new int[array.Rank];
-                for (int i = 0; i < array.Rank; ++i)
-                {
-                    _maxLengths[i] = array.GetLength(i) - 1;
-                }
-                Position = new int[array.Rank];
-            }
-
-            public bool Step()
-            {
-                for (int i = 0; i < Position.Length; ++i)
-                {
-                    if (Position[i] < _maxLengths[i])
-                    {
-                        Position[i]++;
-                        for (int j = 0; j < i; j++)
-                        {
-                            Position[j] = 0;
-                        }
-                        return true;
-                    }
-                }
-                return false;
-            }
-        }
-    }
+	public static class ObjectExtensions
+	{
+		private static readonly MethodInfo CloneMethod = typeof(object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance);
+
+		public static bool IsPrimitive(this Type type)
+		{
+			if (type == typeof(string))
+			{
+				return true;
+			}
+
+			return type.IsValueType & type.IsPrimitive;
+		}
+
+		public static bool IsDefaultValue(this object value)
+		{
+			if (value == default)
+			{
+				return true;
+			}
+
+			return value switch
+			{
+				byte s => s == 0,
+				sbyte s => s == 0,
+				short s => s == 0,
+				char s => s == 0,
+				bool s => s == false,
+				ushort s => s == 0,
+				int s => s == 0,
+				uint s => s == 0,
+				long s => s == 0,
+				ulong s => s == 0,
+				decimal s => s == 0,
+				float s => s == 0,
+				double s => s == 0,
+				Enum s => Equals(s, Enum.GetValues(value.GetType()).GetValue(0)),
+				DateTime s => s == DateTime.MinValue,
+				DateTimeOffset s => s == DateTimeOffset.MinValue,
+				_ => false
+			};
+		}
+
+		public static object DeepClone(this object originalObject)
+		{
+			return InternalCopy(originalObject, new Dictionary<object, object>(new ReferenceEqualityComparer()));
+		}
+
+		public static T DeepClone<T>(this T original)
+		{
+			return (T)DeepClone((object)original);
+		}
+
+		private static object InternalCopy(object originalObject, IDictionary<object, object> visited)
+		{
+			if (originalObject == null)
+			{
+				return null;
+			}
+
+			var typeToReflect = originalObject.GetType();
+			if (IsPrimitive(typeToReflect))
+			{
+				return originalObject;
+			}
+
+			if (visited.ContainsKey(originalObject))
+			{
+				return visited[originalObject];
+			}
+
+			if (typeof(Delegate).IsAssignableFrom(typeToReflect))
+			{
+				return null;
+			}
+
+			var cloneObject = CloneMethod.Invoke(originalObject, null);
+			if (typeToReflect.IsArray)
+			{
+				var arrayType = typeToReflect.GetElementType();
+				if (!IsPrimitive(arrayType))
+				{
+					Array clonedArray = (Array)cloneObject;
+					clonedArray.ForEach((array, indices) => array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices));
+				}
+			}
+
+			visited.Add(originalObject, cloneObject);
+			CopyFields(originalObject, visited, cloneObject, typeToReflect);
+			RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect);
+			return cloneObject;
+		}
+
+		private static void RecursiveCopyBaseTypePrivateFields(object originalObject, IDictionary<object, object> visited, object cloneObject, Type typeToReflect)
+		{
+			if (typeToReflect.BaseType != null)
+			{
+				RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect.BaseType);
+				CopyFields(originalObject, visited, cloneObject, typeToReflect.BaseType, BindingFlags.Instance | BindingFlags.NonPublic, info => info.IsPrivate);
+			}
+		}
+
+		private static void CopyFields(object originalObject, IDictionary<object, object> visited, object cloneObject, Type typeToReflect, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy, Func<FieldInfo, bool> filter = null)
+		{
+			foreach (FieldInfo fieldInfo in typeToReflect.GetFields(bindingFlags))
+			{
+				if (filter != null && !filter(fieldInfo))
+				{
+					continue;
+				}
+
+				if (IsPrimitive(fieldInfo.FieldType) || fieldInfo.IsInitOnly)
+				{
+					continue;
+				}
+
+				var originalFieldValue = fieldInfo.GetValue(originalObject);
+				var clonedFieldValue = InternalCopy(originalFieldValue, visited);
+				fieldInfo.SetValue(cloneObject, clonedFieldValue);
+			}
+		}
+
+		/// <summary>
+		/// 判断是否为null,null或0长度都返回true
+		/// </summary>
+		/// <typeparam name="T"></typeparam>
+		/// <param name="value"></param>
+		/// <returns></returns>
+		public static bool IsNullOrEmpty<T>(this T value)
+		  where T : class
+		{
+			#region 1.对象级别
+
+			//引用为null
+			bool isObjectNull = value is null;
+			if (isObjectNull)
+			{
+				return true;
+			}
+
+			//判断是否为集合
+			var tempEnumerator = (value as IEnumerable)?.GetEnumerator();
+			if (tempEnumerator == null) return false;//这里出去代表是对象 且 引用不为null.所以为false
+
+			#endregion 1.对象级别
+
+			#region 2.集合级别
+
+			//到这里就代表是集合且引用不为空,判断长度
+			//MoveNext方法返回tue代表集合中至少有一个数据,返回false就代表0长度
+			bool isZeroLenth = tempEnumerator.MoveNext() == false;
+			if (isZeroLenth) return true;
+
+			return isZeroLenth;
+
+			#endregion 2.集合级别
+		}
+
+		/// <summary>
+		/// 转成非null
+		/// </summary>
+		/// <param name="s"></param>
+		/// <param name="value">为空时的替换值</param>
+		/// <returns></returns>
+		public static T IfNull<T>(this T s, in T value)
+		{
+			return s ?? value;
+		}
+
+		/// <summary>
+		/// 转换成json字符串
+		/// </summary>
+		/// <param name="obj"></param>
+		/// <param name="setting"></param>
+		/// <returns></returns>
+		public static string ToJsonString(this object obj, JsonSerializerSettings setting = null)
+		{
+			if (obj == null) return string.Empty;
+			return JsonConvert.SerializeObject(obj, setting);
+		}
+
+		/// <summary>
+		/// 链式操作
+		/// </summary>
+		/// <typeparam name="T1"></typeparam>
+		/// <typeparam name="T2"></typeparam>
+		/// <param name="source"></param>
+		/// <param name="action"></param>
+		public static T2 Next<T1, T2>(this T1 source, Func<T1, T2> action)
+		{
+			return action(source);
+		}
+
+		/// <summary>
+		/// 将对象转换成字典
+		/// </summary>
+		/// <param name="value"></param>
+		public static Dictionary<string, object> ToDictionary(this object value)
+		{
+			var dictionary = new Dictionary<string, object>();
+			if (value != null)
+			{
+				foreach (var property in value.GetType().GetProperties())
+				{
+					var obj = property.GetValue(value, null);
+					dictionary.Add(property.Name, obj);
+				}
+			}
+
+			return dictionary;
+		}
+
+		/// <summary>
+		/// 将对象转换成字典
+		/// </summary>
+		/// <param name="value"></param>
+		public static Dictionary<string, string> ToDictionary(this JObject value)
+		{
+			var dictionary = new Dictionary<string, string>();
+			if (value != null)
+			{
+				var enumerator = value.GetEnumerator();
+				while (enumerator.MoveNext())
+				{
+					var obj = enumerator.Current.Value ?? string.Empty;
+					dictionary.Add(enumerator.Current.Key, obj + string.Empty);
+				}
+			}
+
+			return dictionary;
+		}
+
+		/// <summary>
+		/// 对象转换成动态类型
+		/// </summary>
+		/// <param name="obj"></param>
+		/// <returns></returns>
+		public static dynamic ToDynamic(this object obj)
+		{
+			return DynamicFactory.WithObject(obj);
+		}
+
+		/// <summary>
+		/// 多个对象的属性值合并
+		/// </summary>
+		/// <typeparam name="T"></typeparam>
+		/// <param name="a"></param>
+		/// <param name="b"></param>
+		/// <param name="others"></param>
+		public static void Merge<T>(this T a, T b, params T[] others) where T : class
+		{
+			foreach (var item in new[] { b }.Concat(others))
+			{
+				var dic = item.ToDictionary();
+				foreach (var p in dic.Where(p => a.GetProperty(p.Key).IsDefaultValue()))
+				{
+					a.SetProperty(p.Key, p.Value);
+				}
+			}
+		}
+	}
+
+	internal class ReferenceEqualityComparer : EqualityComparer<object>
+	{
+		public override bool Equals(object x, object y)
+		{
+			return ReferenceEquals(x, y);
+		}
+
+		public override int GetHashCode(object obj)
+		{
+			if (obj is null) return 0;
+			return obj.GetHashCode();
+		}
+	}
+
+	internal static class ArrayExtensions
+	{
+		public static void ForEach(this Array array, Action<Array, int[]> action)
+		{
+			if (array.LongLength == 0)
+			{
+				return;
+			}
+
+			ArrayTraverse walker = new ArrayTraverse(array);
+			do action(array, walker.Position);
+			while (walker.Step());
+		}
+
+		internal class ArrayTraverse
+		{
+			public int[] Position;
+			private readonly int[] _maxLengths;
+
+			public ArrayTraverse(Array array)
+			{
+				_maxLengths = new int[array.Rank];
+				for (int i = 0; i < array.Rank; ++i)
+				{
+					_maxLengths[i] = array.GetLength(i) - 1;
+				}
+				Position = new int[array.Rank];
+			}
+
+			public bool Step()
+			{
+				for (int i = 0; i < Position.Length; ++i)
+				{
+					if (Position[i] < _maxLengths[i])
+					{
+						Position[i]++;
+						for (int j = 0; j < i; j++)
+						{
+							Position[j] = 0;
+						}
+						return true;
+					}
+				}
+				return false;
+			}
+		}
+	}
 }
 }

+ 1 - 1
Masuit.Tools.Abstractions/Masuit.Tools.Abstractions.csproj

@@ -3,7 +3,7 @@
         <TargetFrameworks>netstandard2.0;netstandard2.1;net461;net5;net6;net7</TargetFrameworks>
         <TargetFrameworks>netstandard2.0;netstandard2.1;net461;net5;net6;net7</TargetFrameworks>
         <LangVersion>latest</LangVersion>
         <LangVersion>latest</LangVersion>
         <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
         <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-        <Version>2.6.2.1</Version>
+        <Version>2.6.2.2</Version>
         <Authors>懒得勤快</Authors>
         <Authors>懒得勤快</Authors>
         <Description>Masuit.Tools基础公共库,包含一些常用的操作类,大都是静态类,加密解密,反射操作,Excel简单导出,权重随机筛选算法,分布式短id,表达式树,linq扩展,文件压缩,多线程下载和FTP客户端,硬件信息,字符串扩展方法,日期时间扩展操作,中国农历,大文件拷贝,图像裁剪,验证码,断点续传,集合扩展等常用封装。</Description>
         <Description>Masuit.Tools基础公共库,包含一些常用的操作类,大都是静态类,加密解密,反射操作,Excel简单导出,权重随机筛选算法,分布式短id,表达式树,linq扩展,文件压缩,多线程下载和FTP客户端,硬件信息,字符串扩展方法,日期时间扩展操作,中国农历,大文件拷贝,图像裁剪,验证码,断点续传,集合扩展等常用封装。</Description>
         <Copyright>懒得勤快,长空X</Copyright>
         <Copyright>懒得勤快,长空X</Copyright>

+ 509 - 486
Masuit.Tools.Abstractions/Reflection/ReflectionUtil.cs

@@ -13,490 +13,513 @@ using Masuit.Tools.Systems;
 
 
 namespace Masuit.Tools.Reflection
 namespace Masuit.Tools.Reflection
 {
 {
-    /// <summary>
-    /// 反射操作辅助类,如获取或设置字段、属性的值等反射信息。
-    /// </summary>
-    public static class ReflectionUtil
-    {
-        #region 属性字段设置
-
-        public static BindingFlags bf = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;
-
-        /// <summary>
-        /// 执行方法
-        /// </summary>
-        /// <param name="obj">反射对象</param>
-        /// <param name="methodName">方法名,区分大小写</param>
-        /// <param name="args">方法参数</param>
-        /// <typeparam name="T">约束返回的T必须是引用类型</typeparam>
-        /// <returns>T类型</returns>
-        public static T InvokeMethod<T>(this object obj, string methodName, object[] args)
-        {
-            return (T)obj.GetType().GetMethod(methodName, args.Select(o => o.GetType()).ToArray()).Invoke(obj, args);
-        }
-
-        /// <summary>
-        /// 执行方法
-        /// </summary>
-        /// <param name="obj">反射对象</param>
-        /// <param name="methodName">方法名,区分大小写</param>
-        /// <param name="args">方法参数</param>
-        /// <returns>T类型</returns>
-        public static void InvokeMethod(this object obj, string methodName, object[] args)
-        {
-            var type = obj.GetType();
-            type.GetMethod(methodName, args.Select(o => o.GetType()).ToArray()).Invoke(obj, args);
-        }
-
-        /// <summary>
-        /// 设置字段
-        /// </summary>
-        /// <param name="obj">反射对象</param>
-        /// <param name="name">字段名</param>
-        /// <param name="value">值</param>
-        public static void SetField<T>(this T obj, string name, object value) where T : class
-        {
-            SetProperty(obj, name, value);
-        }
-
-        /// <summary>
-        /// 获取字段
-        /// </summary>
-        /// <param name="obj">反射对象</param>
-        /// <param name="name">字段名</param>
-        /// <typeparam name="T">约束返回的T必须是引用类型</typeparam>
-        /// <returns>T类型</returns>
-        public static T GetField<T>(this object obj, string name)
-        {
-            return GetProperty<T>(obj, name);
-        }
-
-        /// <summary>
-        /// 获取所有的字段信息
-        /// </summary>
-        /// <param name="obj">反射对象</param>
-        /// <returns>字段信息</returns>
-        public static FieldInfo[] GetFields(this object obj)
-        {
-            FieldInfo[] fieldInfos = obj.GetType().GetFields(bf);
-            return fieldInfos;
-        }
-
-        /// <summary>
-        /// 设置属性
-        /// </summary>
-        /// <param name="obj">反射对象</param>
-        /// <param name="name">属性名</param>
-        /// <param name="value">值</param>
-        public static string SetProperty<T>(this T obj, string name, object value) where T : class
-        {
-            var parameter = Expression.Parameter(typeof(T), "e");
-            var property = Expression.PropertyOrField(parameter, name);
-            var before = Expression.Lambda(property, parameter).Compile().DynamicInvoke(obj);
-            if (value == before)
-            {
-                return value?.ToString();
-            }
-
-            if (property.Type.IsGenericType && property.Type.GetGenericTypeDefinition() == typeof(Nullable<>))
-            {
-                typeof(T).GetProperty(name)?.SetValue(obj, value);
-            }
-            else
-            {
-                var valueExpression = Expression.Parameter(property.Type, "v");
-                var assign = Expression.Assign(property, valueExpression);
-                Expression.Lambda(assign, parameter, valueExpression).Compile().DynamicInvoke(obj, value);
-            }
-
-            return before.ToJsonString();
-        }
-
-        private static readonly ConcurrentDictionary<string, Delegate> DelegateCache = new();
-
-        /// <summary>
-        /// 获取属性
-        /// </summary>
-        /// <param name="obj">反射对象</param>
-        /// <param name="name">属性名</param>
-        /// <typeparam name="T">约束返回的T必须是引用类型</typeparam>
-        /// <returns>T类型</returns>
-        public static T GetProperty<T>(this object obj, string name)
-        {
-            var type = obj.GetType();
-            if (DelegateCache.TryGetValue(type.Name + "." + name, out var func))
-            {
-                return (T)func.DynamicInvoke(obj);
-            }
-            var parameter = Expression.Parameter(type, "e");
-            var property = Expression.PropertyOrField(parameter, name);
-            func = Expression.Lambda(property, parameter).Compile();
-            DelegateCache.TryAdd(type.Name + "." + name, func);
-            return (T)func.DynamicInvoke(obj);
-        }
-
-        /// <summary>
-        /// 获取所有的属性信息
-        /// </summary>
-        /// <param name="obj">反射对象</param>
-        /// <returns>属性信息</returns>
-        public static PropertyInfo[] GetProperties(this object obj)
-        {
-            return obj.GetType().GetProperties(bf);
-        }
-
-        #endregion 属性字段设置
-
-        #region 获取Description
-
-        /// <summary>
-        /// 获取枚举值的Description信息
-        /// </summary>
-        /// <param name ="value">枚举值</param>
-        /// <param name ="args">要格式化的对象</param>
-        /// <returns>如果未找到DescriptionAttribute则返回null或返回类型描述</returns>
-        public static string GetDescription(this Enum value, params object[] args)
-        {
-            if (value == null)
-            {
-                throw new ArgumentNullException(nameof(value));
-            }
-
-            var type = value.GetType();
-            if (!Enum.IsDefined(type, value))
-            {
-                return value.ToString();
-            }
-
-            FieldInfo fi = type.GetField(value.ToString());
-            var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
-            var text = attributes.Length > 0 ? attributes[0].Description : value.ToString();
-            if (args is { Length: > 0 })
-            {
-                return string.Format(text, args);
-            }
-
-            return text;
-        }
-
-        /// <summary>
-        /// 获取枚举值的Description信息
-        /// </summary>
-        /// <param name ="value">枚举值</param>
-        /// <returns>如果未找到DescriptionAttribute则返回null或返回类型描述</returns>
-        public static EnumDescriptionAttribute GetEnumDescription(this Enum value)
-        {
-            return GetEnumDescriptions(value).FirstOrDefault();
-        }
-
-        /// <summary>
-        /// 获取枚举值的Description信息
-        /// </summary>
-        /// <param name ="value">枚举值</param>
-        /// <returns>如果未找到DescriptionAttribute则返回null或返回类型描述</returns>
-        public static NullableDictionary<string, (string Description, string Display)> GetTypedEnumDescriptions(this Enum value)
-        {
-            return GetEnumDescriptions(value).ToDictionarySafety(a => a.Language, a => (Description: a.Description, Display: a.Display));
-        }
-
-        /// <summary>
-        /// 获取枚举值的Description信息
-        /// </summary>
-        /// <param name ="value">枚举值</param>
-        /// <returns>如果未找到DescriptionAttribute则返回null或返回类型描述</returns>
-        public static IEnumerable<EnumDescriptionAttribute> GetEnumDescriptions(this Enum value)
-        {
-            if (value == null)
-            {
-                throw new ArgumentNullException(nameof(value));
-            }
-
-            var type = value.GetType();
-            if (!Enum.IsDefined(type, value))
-            {
-                return new List<EnumDescriptionAttribute>();
-            }
-
-            FieldInfo fi = type.GetField(value.ToString());
-            return fi.GetCustomAttributes(typeof(EnumDescriptionAttribute), false).OfType<EnumDescriptionAttribute>();
-        }
-
-        /// <summary>
-        ///	根据成员信息获取Description信息
-        /// </summary>
-        /// <param name="member">成员信息</param>
-        /// <returns>如果未找到DescriptionAttribute则返回null或返回类型描述</returns>
-        public static string GetDescription(this MemberInfo member)
-        {
-            return GetDescription(member, null);
-        }
-
-        /// <summary>
-        /// 根据成员信息获取Description信息
-        /// </summary>
-        /// <param name="member">成员信息</param>
-        /// <param name="args">格式化占位对象</param>
-        /// <returns>如果未找到DescriptionAttribute则返回null或返回类型描述</returns>
-        public static string GetDescription(this MemberInfo member, params object[] args)
-        {
-            if (member == null)
-            {
-                throw new ArgumentNullException(nameof(member));
-            }
-
-            return member.IsDefined(typeof(DescriptionAttribute), false) ? member.GetAttribute<DescriptionAttribute>().Description : string.Empty;
-        }
-
-        #endregion 获取Description
-
-        /// <summary>
-        /// 获取对象的Attribute
-        /// </summary>
-        /// <returns></returns>
-        public static T GetAttribute<T>(this ICustomAttributeProvider provider) where T : Attribute
-        {
-            var attributes = provider.GetCustomAttributes(typeof(T), true);
-            return attributes.Length > 0 ? attributes[0] as T : null;
-        }
-
-        /// <summary>
-        /// 获取对象的Attributes
-        /// </summary>
-        /// <returns></returns>
-        public static IEnumerable<T> GetAttributes<T>(this ICustomAttributeProvider provider) where T : Attribute
-        {
-            return provider.GetCustomAttributes(typeof(T), true).OfType<T>();
-        }
-
-        #region 资源获取
-
-        /// <summary>
-        /// 根据资源名称获取图片资源流
-        /// </summary>
-        /// <param name="_"></param>
-        /// <param name="resourceName">资源的名称</param>
-        /// <returns>数据流</returns>
-        public static Stream GetImageResource(this Assembly _, string resourceName)
-        {
-            Assembly asm = Assembly.GetExecutingAssembly();
-            return asm.GetManifestResourceStream(resourceName);
-        }
-
-        /// <summary>
-        ///  获取程序集资源的文本资源
-        /// </summary>
-        /// <param name="assemblyType">程序集中的某一对象类型</param>
-        /// <param name="resName">资源项名称</param>
-        /// <param name="resourceHolder">资源的根名称。例如,名为“MyResource.en-US.resources”的资源文件的根名称为“MyResource”。</param>
-        public static string GetStringRes(this Type assemblyType, string resName, string resourceHolder)
-        {
-            Assembly thisAssembly = Assembly.GetAssembly(assemblyType);
-            ResourceManager rm = new ResourceManager(resourceHolder, thisAssembly);
-            return rm.GetString(resName);
-        }
-
-        /// <summary>
-        /// 获取程序集嵌入资源的文本形式
-        /// </summary>
-        /// <param name="assemblyType">程序集中的某一对象类型</param>
-        /// <param name="charset">字符集编码</param>
-        /// <param name="resName">嵌入资源相对路径</param>
-        /// <returns>如没找到该资源则返回空字符</returns>
-        public static string GetManifestString(this Type assemblyType, string charset, string resName)
-        {
-            Assembly asm = Assembly.GetAssembly(assemblyType);
-            Stream st = asm.GetManifestResourceStream(string.Concat(assemblyType.Namespace, ".", resName.Replace("/", ".")));
-            if (st == null)
-            {
-                return "";
-            }
-
-            int iLen = (int)st.Length;
-            byte[] bytes = new byte[iLen];
-            st.Read(bytes, 0, iLen);
-            return Encoding.GetEncoding(charset).GetString(bytes);
-        }
-
-        #endregion 资源获取
-
-        #region 创建实例
-
-        /// <summary>
-        /// 获取默认实例
-        /// </summary>
-        /// <param name="type">类型</param>
-        /// <returns></returns>
-        public static object GetInstance(this Type type)
-        {
-            return GetInstance<TypeToIgnore, object>(type, null);
-        }
-
-        /// <summary>
-        /// 获取默认实例
-        /// </summary>
-        /// <param name="type">类型</param>
-        /// <returns></returns>
-        public static T GetInstance<T>(this Type type) where T : class, new()
-        {
-            return GetInstance<TypeToIgnore, T>(type, null);
-        }
-
-        /// <summary>
-        /// 获取默认实例
-        /// </summary>
-        /// <param name="type">类型</param>
-        /// <returns></returns>
-        public static T GetInstance<T>(string type) where T : class, new()
-        {
-            return GetInstance<TypeToIgnore, T>(Type.GetType(type), null);
-        }
-
-        /// <summary>
-        /// 获取默认实例
-        /// </summary>
-        /// <param name="type">类型</param>
-        /// <returns></returns>
-        public static object GetInstance(string type)
-        {
-            return GetInstance<TypeToIgnore, object>(Type.GetType(type), null);
-        }
-
-        /// <summary>
-        /// 获取一个构造参数的实例
-        /// </summary>
-        /// <typeparam name="TArg">参数类型</typeparam>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="type">实例类型</param>
-        /// <param name="argument">参数值</param>
-        /// <returns></returns>
-        public static T GetInstance<TArg, T>(this Type type, TArg argument) where T : class, new()
-        {
-            return GetInstance<TArg, TypeToIgnore, T>(type, argument, null);
-        }
-
-        /// <summary>
-        /// 获取一个构造参数的实例
-        /// </summary>
-        /// <typeparam name="TArg">参数类型</typeparam>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="type">实例类型</param>
-        /// <param name="argument">参数值</param>
-        /// <returns></returns>
-        public static T GetInstance<TArg, T>(string type, TArg argument) where T : class, new()
-        {
-            return GetInstance<TArg, TypeToIgnore, T>(Type.GetType(type), argument, null);
-        }
-
-        /// <summary>
-        /// 获取2个构造参数的实例
-        /// </summary>
-        /// <typeparam name="TArg1">参数类型</typeparam>
-        /// <typeparam name="TArg2">参数类型</typeparam>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="type">实例类型</param>
-        /// <param name="argument1">参数值</param>
-        /// <param name="argument2">参数值</param>
-        /// <returns></returns>
-        public static T GetInstance<TArg1, TArg2, T>(this Type type, TArg1 argument1, TArg2 argument2) where T : class, new()
-        {
-            return GetInstance<TArg1, TArg2, TypeToIgnore, T>(type, argument1, argument2, null);
-        }
-
-        /// <summary>
-        /// 获取2个构造参数的实例
-        /// </summary>
-        /// <typeparam name="TArg1">参数类型</typeparam>
-        /// <typeparam name="TArg2">参数类型</typeparam>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="type">实例类型</param>
-        /// <param name="argument1">参数值</param>
-        /// <param name="argument2">参数值</param>
-        /// <returns></returns>
-        public static T GetInstance<TArg1, TArg2, T>(string type, TArg1 argument1, TArg2 argument2) where T : class, new()
-        {
-            return GetInstance<TArg1, TArg2, TypeToIgnore, T>(Type.GetType(type), argument1, argument2, null);
-        }
-
-        /// <summary>
-        /// 获取3个构造参数的实例
-        /// </summary>
-        /// <typeparam name="TArg1">参数类型</typeparam>
-        /// <typeparam name="TArg2">参数类型</typeparam>
-        /// <typeparam name="TArg3">参数类型</typeparam>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="type">实例类型</param>
-        /// <param name="argument1">参数值</param>
-        /// <param name="argument2">参数值</param>
-        /// <param name="argument3">参数值</param>
-        /// <returns></returns>
-        public static T GetInstance<TArg1, TArg2, TArg3, T>(this Type type, TArg1 argument1, TArg2 argument2, TArg3 argument3) where T : class, new()
-        {
-            return InstanceCreationFactory<TArg1, TArg2, TArg3, T>.CreateInstanceOf(type, argument1, argument2, argument3);
-        }
-
-        /// <summary>
-        /// 获取3个构造参数的实例
-        /// </summary>
-        /// <typeparam name="TArg1">参数类型</typeparam>
-        /// <typeparam name="TArg2">参数类型</typeparam>
-        /// <typeparam name="TArg3">参数类型</typeparam>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="type">实例类型</param>
-        /// <param name="argument1">参数值</param>
-        /// <param name="argument2">参数值</param>
-        /// <param name="argument3">参数值</param>
-        /// <returns></returns>
-        public static T GetInstance<TArg1, TArg2, TArg3, T>(string type, TArg1 argument1, TArg2 argument2, TArg3 argument3) where T : class, new()
-        {
-            return InstanceCreationFactory<TArg1, TArg2, TArg3, T>.CreateInstanceOf(Type.GetType(type), argument1, argument2, argument3);
-        }
-
-        private class TypeToIgnore
-        {
-        }
-
-        private static class InstanceCreationFactory<TArg1, TArg2, TArg3, TObject> where TObject : class, new()
-        {
-            private static readonly Dictionary<Type, Func<TArg1, TArg2, TArg3, TObject>> InstanceCreationMethods = new Dictionary<Type, Func<TArg1, TArg2, TArg3, TObject>>();
-
-            public static TObject CreateInstanceOf(Type type, TArg1 arg1, TArg2 arg2, TArg3 arg3)
-            {
-                CacheInstanceCreationMethodIfRequired(type);
-
-                return InstanceCreationMethods[type](arg1, arg2, arg3);
-            }
-
-            private static void CacheInstanceCreationMethodIfRequired(Type type)
-            {
-                if (InstanceCreationMethods.ContainsKey(type))
-                {
-                    return;
-                }
-
-                var argumentTypes = new[]
-                {
-                    typeof(TArg1),
-                    typeof(TArg2),
-                    typeof(TArg3)
-                };
-
-                Type[] constructorArgumentTypes = argumentTypes.Where(t => t != typeof(TypeToIgnore)).ToArray();
-                var constructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null, CallingConventions.HasThis, constructorArgumentTypes, new ParameterModifier[0]);
-
-                var lamdaParameterExpressions = new[]
-                {
-                    Expression.Parameter(typeof(TArg1), "param1"),
-                    Expression.Parameter(typeof(TArg2), "param2"),
-                    Expression.Parameter(typeof(TArg3), "param3")
-                };
-
-                var constructorParameterExpressions = lamdaParameterExpressions.Take(constructorArgumentTypes.Length).ToArray();
-                var constructorCallExpression = Expression.New(constructor, constructorParameterExpressions);
-                var constructorCallingLambda = Expression.Lambda<Func<TArg1, TArg2, TArg3, TObject>>(constructorCallExpression, lamdaParameterExpressions).Compile();
-                InstanceCreationMethods[type] = constructorCallingLambda;
-            }
-        }
-
-        #endregion 创建实例
-    }
+	/// <summary>
+	/// 反射操作辅助类,如获取或设置字段、属性的值等反射信息。
+	/// </summary>
+	public static class ReflectionUtil
+	{
+		#region 属性字段设置
+
+		public static BindingFlags bf = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;
+
+		/// <summary>
+		/// 执行方法
+		/// </summary>
+		/// <param name="obj">反射对象</param>
+		/// <param name="methodName">方法名,区分大小写</param>
+		/// <param name="args">方法参数</param>
+		/// <typeparam name="T">约束返回的T必须是引用类型</typeparam>
+		/// <returns>T类型</returns>
+		public static T InvokeMethod<T>(this object obj, string methodName, object[] args)
+		{
+			return (T)obj.GetType().GetMethod(methodName, args.Select(o => o.GetType()).ToArray()).Invoke(obj, args);
+		}
+
+		/// <summary>
+		/// 执行方法
+		/// </summary>
+		/// <param name="obj">反射对象</param>
+		/// <param name="methodName">方法名,区分大小写</param>
+		/// <param name="args">方法参数</param>
+		/// <returns>T类型</returns>
+		public static void InvokeMethod(this object obj, string methodName, object[] args)
+		{
+			var type = obj.GetType();
+			type.GetMethod(methodName, args.Select(o => o.GetType()).ToArray()).Invoke(obj, args);
+		}
+
+		/// <summary>
+		/// 设置字段
+		/// </summary>
+		/// <param name="obj">反射对象</param>
+		/// <param name="name">字段名</param>
+		/// <param name="value">值</param>
+		public static void SetField<T>(this T obj, string name, object value) where T : class
+		{
+			SetProperty(obj, name, value);
+		}
+
+		/// <summary>
+		/// 获取字段
+		/// </summary>
+		/// <param name="obj">反射对象</param>
+		/// <param name="name">字段名</param>
+		/// <typeparam name="T">约束返回的T必须是引用类型</typeparam>
+		/// <returns>T类型</returns>
+		public static T GetField<T>(this object obj, string name)
+		{
+			return GetProperty<T>(obj, name);
+		}
+
+		/// <summary>
+		/// 获取字段
+		/// </summary>
+		/// <param name="obj">反射对象</param>
+		/// <param name="name">字段名</param>
+		/// <typeparam name="T">约束返回的T必须是引用类型</typeparam>
+		/// <returns>T类型</returns>
+		public static object GetField(this object obj, string name)
+		{
+			return GetProperty(obj, name);
+		}
+
+		/// <summary>
+		/// 获取所有的字段信息
+		/// </summary>
+		/// <param name="obj">反射对象</param>
+		/// <returns>字段信息</returns>
+		public static FieldInfo[] GetFields(this object obj)
+		{
+			FieldInfo[] fieldInfos = obj.GetType().GetFields(bf);
+			return fieldInfos;
+		}
+
+		/// <summary>
+		/// 设置属性
+		/// </summary>
+		/// <param name="obj">反射对象</param>
+		/// <param name="name">属性名</param>
+		/// <param name="value">值</param>
+		public static string SetProperty<T>(this T obj, string name, object value) where T : class
+		{
+			var parameter = Expression.Parameter(typeof(T), "e");
+			var property = Expression.PropertyOrField(parameter, name);
+			var before = Expression.Lambda(property, parameter).Compile().DynamicInvoke(obj);
+			if (value == before)
+			{
+				return value?.ToString();
+			}
+
+			if (property.Type.IsGenericType && property.Type.GetGenericTypeDefinition() == typeof(Nullable<>))
+			{
+				typeof(T).GetProperty(name)?.SetValue(obj, value);
+			}
+			else
+			{
+				var valueExpression = Expression.Parameter(property.Type, "v");
+				var assign = Expression.Assign(property, valueExpression);
+				Expression.Lambda(assign, parameter, valueExpression).Compile().DynamicInvoke(obj, value);
+			}
+
+			return before.ToJsonString();
+		}
+
+		private static readonly ConcurrentDictionary<string, Delegate> DelegateCache = new();
+
+		/// <summary>
+		/// 获取属性
+		/// </summary>
+		/// <param name="obj">反射对象</param>
+		/// <param name="name">属性名</param>
+		/// <typeparam name="T">约束返回的T必须是引用类型</typeparam>
+		/// <returns>T类型</returns>
+		public static T GetProperty<T>(this object obj, string name)
+		{
+			return (T)GetProperty(obj, name);
+		}
+
+		/// <summary>
+		/// 获取属性
+		/// </summary>
+		/// <param name="obj">反射对象</param>
+		/// <param name="name">属性名</param>
+		/// <returns>T类型</returns>
+		public static object GetProperty(this object obj, string name)
+		{
+			var type = obj.GetType();
+			if (DelegateCache.TryGetValue(type.Name + "." + name, out var func))
+			{
+				return func.DynamicInvoke(obj);
+			}
+			var parameter = Expression.Parameter(type, "e");
+			var property = Expression.PropertyOrField(parameter, name);
+			func = Expression.Lambda(property, parameter).Compile();
+			DelegateCache.TryAdd(type.Name + "." + name, func);
+			return func.DynamicInvoke(obj);
+		}
+
+		/// <summary>
+		/// 获取所有的属性信息
+		/// </summary>
+		/// <param name="obj">反射对象</param>
+		/// <returns>属性信息</returns>
+		public static PropertyInfo[] GetProperties(this object obj)
+		{
+			return obj.GetType().GetProperties(bf);
+		}
+
+		#endregion 属性字段设置
+
+		#region 获取Description
+
+		/// <summary>
+		/// 获取枚举值的Description信息
+		/// </summary>
+		/// <param name ="value">枚举值</param>
+		/// <param name ="args">要格式化的对象</param>
+		/// <returns>如果未找到DescriptionAttribute则返回null或返回类型描述</returns>
+		public static string GetDescription(this Enum value, params object[] args)
+		{
+			if (value == null)
+			{
+				throw new ArgumentNullException(nameof(value));
+			}
+
+			var type = value.GetType();
+			if (!Enum.IsDefined(type, value))
+			{
+				return value.ToString();
+			}
+
+			FieldInfo fi = type.GetField(value.ToString());
+			var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
+			var text = attributes.Length > 0 ? attributes[0].Description : value.ToString();
+			if (args is { Length: > 0 })
+			{
+				return string.Format(text, args);
+			}
+
+			return text;
+		}
+
+		/// <summary>
+		/// 获取枚举值的Description信息
+		/// </summary>
+		/// <param name ="value">枚举值</param>
+		/// <returns>如果未找到DescriptionAttribute则返回null或返回类型描述</returns>
+		public static EnumDescriptionAttribute GetEnumDescription(this Enum value)
+		{
+			return GetEnumDescriptions(value).FirstOrDefault();
+		}
+
+		/// <summary>
+		/// 获取枚举值的Description信息
+		/// </summary>
+		/// <param name ="value">枚举值</param>
+		/// <returns>如果未找到DescriptionAttribute则返回null或返回类型描述</returns>
+		public static NullableDictionary<string, (string Description, string Display)> GetTypedEnumDescriptions(this Enum value)
+		{
+			return GetEnumDescriptions(value).ToDictionarySafety(a => a.Language, a => (Description: a.Description, Display: a.Display));
+		}
+
+		/// <summary>
+		/// 获取枚举值的Description信息
+		/// </summary>
+		/// <param name ="value">枚举值</param>
+		/// <returns>如果未找到DescriptionAttribute则返回null或返回类型描述</returns>
+		public static IEnumerable<EnumDescriptionAttribute> GetEnumDescriptions(this Enum value)
+		{
+			if (value == null)
+			{
+				throw new ArgumentNullException(nameof(value));
+			}
+
+			var type = value.GetType();
+			if (!Enum.IsDefined(type, value))
+			{
+				return new List<EnumDescriptionAttribute>();
+			}
+
+			FieldInfo fi = type.GetField(value.ToString());
+			return fi.GetCustomAttributes(typeof(EnumDescriptionAttribute), false).OfType<EnumDescriptionAttribute>();
+		}
+
+		/// <summary>
+		///	根据成员信息获取Description信息
+		/// </summary>
+		/// <param name="member">成员信息</param>
+		/// <returns>如果未找到DescriptionAttribute则返回null或返回类型描述</returns>
+		public static string GetDescription(this MemberInfo member)
+		{
+			return GetDescription(member, null);
+		}
+
+		/// <summary>
+		/// 根据成员信息获取Description信息
+		/// </summary>
+		/// <param name="member">成员信息</param>
+		/// <param name="args">格式化占位对象</param>
+		/// <returns>如果未找到DescriptionAttribute则返回null或返回类型描述</returns>
+		public static string GetDescription(this MemberInfo member, params object[] args)
+		{
+			if (member == null)
+			{
+				throw new ArgumentNullException(nameof(member));
+			}
+
+			return member.IsDefined(typeof(DescriptionAttribute), false) ? member.GetAttribute<DescriptionAttribute>().Description : string.Empty;
+		}
+
+		#endregion 获取Description
+
+		/// <summary>
+		/// 获取对象的Attribute
+		/// </summary>
+		/// <returns></returns>
+		public static T GetAttribute<T>(this ICustomAttributeProvider provider) where T : Attribute
+		{
+			var attributes = provider.GetCustomAttributes(typeof(T), true);
+			return attributes.Length > 0 ? attributes[0] as T : null;
+		}
+
+		/// <summary>
+		/// 获取对象的Attributes
+		/// </summary>
+		/// <returns></returns>
+		public static IEnumerable<T> GetAttributes<T>(this ICustomAttributeProvider provider) where T : Attribute
+		{
+			return provider.GetCustomAttributes(typeof(T), true).OfType<T>();
+		}
+
+		#region 资源获取
+
+		/// <summary>
+		/// 根据资源名称获取图片资源流
+		/// </summary>
+		/// <param name="_"></param>
+		/// <param name="resourceName">资源的名称</param>
+		/// <returns>数据流</returns>
+		public static Stream GetImageResource(this Assembly _, string resourceName)
+		{
+			Assembly asm = Assembly.GetExecutingAssembly();
+			return asm.GetManifestResourceStream(resourceName);
+		}
+
+		/// <summary>
+		///  获取程序集资源的文本资源
+		/// </summary>
+		/// <param name="assemblyType">程序集中的某一对象类型</param>
+		/// <param name="resName">资源项名称</param>
+		/// <param name="resourceHolder">资源的根名称。例如,名为“MyResource.en-US.resources”的资源文件的根名称为“MyResource”。</param>
+		public static string GetStringRes(this Type assemblyType, string resName, string resourceHolder)
+		{
+			Assembly thisAssembly = Assembly.GetAssembly(assemblyType);
+			ResourceManager rm = new ResourceManager(resourceHolder, thisAssembly);
+			return rm.GetString(resName);
+		}
+
+		/// <summary>
+		/// 获取程序集嵌入资源的文本形式
+		/// </summary>
+		/// <param name="assemblyType">程序集中的某一对象类型</param>
+		/// <param name="charset">字符集编码</param>
+		/// <param name="resName">嵌入资源相对路径</param>
+		/// <returns>如没找到该资源则返回空字符</returns>
+		public static string GetManifestString(this Type assemblyType, string charset, string resName)
+		{
+			Assembly asm = Assembly.GetAssembly(assemblyType);
+			Stream st = asm.GetManifestResourceStream(string.Concat(assemblyType.Namespace, ".", resName.Replace("/", ".")));
+			if (st == null)
+			{
+				return "";
+			}
+
+			int iLen = (int)st.Length;
+			byte[] bytes = new byte[iLen];
+			st.Read(bytes, 0, iLen);
+			return Encoding.GetEncoding(charset).GetString(bytes);
+		}
+
+		#endregion 资源获取
+
+		#region 创建实例
+
+		/// <summary>
+		/// 获取默认实例
+		/// </summary>
+		/// <param name="type">类型</param>
+		/// <returns></returns>
+		public static object GetInstance(this Type type)
+		{
+			return GetInstance<TypeToIgnore, object>(type, null);
+		}
+
+		/// <summary>
+		/// 获取默认实例
+		/// </summary>
+		/// <param name="type">类型</param>
+		/// <returns></returns>
+		public static T GetInstance<T>(this Type type) where T : class, new()
+		{
+			return GetInstance<TypeToIgnore, T>(type, null);
+		}
+
+		/// <summary>
+		/// 获取默认实例
+		/// </summary>
+		/// <param name="type">类型</param>
+		/// <returns></returns>
+		public static T GetInstance<T>(string type) where T : class, new()
+		{
+			return GetInstance<TypeToIgnore, T>(Type.GetType(type), null);
+		}
+
+		/// <summary>
+		/// 获取默认实例
+		/// </summary>
+		/// <param name="type">类型</param>
+		/// <returns></returns>
+		public static object GetInstance(string type)
+		{
+			return GetInstance<TypeToIgnore, object>(Type.GetType(type), null);
+		}
+
+		/// <summary>
+		/// 获取一个构造参数的实例
+		/// </summary>
+		/// <typeparam name="TArg">参数类型</typeparam>
+		/// <typeparam name="T"></typeparam>
+		/// <param name="type">实例类型</param>
+		/// <param name="argument">参数值</param>
+		/// <returns></returns>
+		public static T GetInstance<TArg, T>(this Type type, TArg argument) where T : class, new()
+		{
+			return GetInstance<TArg, TypeToIgnore, T>(type, argument, null);
+		}
+
+		/// <summary>
+		/// 获取一个构造参数的实例
+		/// </summary>
+		/// <typeparam name="TArg">参数类型</typeparam>
+		/// <typeparam name="T"></typeparam>
+		/// <param name="type">实例类型</param>
+		/// <param name="argument">参数值</param>
+		/// <returns></returns>
+		public static T GetInstance<TArg, T>(string type, TArg argument) where T : class, new()
+		{
+			return GetInstance<TArg, TypeToIgnore, T>(Type.GetType(type), argument, null);
+		}
+
+		/// <summary>
+		/// 获取2个构造参数的实例
+		/// </summary>
+		/// <typeparam name="TArg1">参数类型</typeparam>
+		/// <typeparam name="TArg2">参数类型</typeparam>
+		/// <typeparam name="T"></typeparam>
+		/// <param name="type">实例类型</param>
+		/// <param name="argument1">参数值</param>
+		/// <param name="argument2">参数值</param>
+		/// <returns></returns>
+		public static T GetInstance<TArg1, TArg2, T>(this Type type, TArg1 argument1, TArg2 argument2) where T : class, new()
+		{
+			return GetInstance<TArg1, TArg2, TypeToIgnore, T>(type, argument1, argument2, null);
+		}
+
+		/// <summary>
+		/// 获取2个构造参数的实例
+		/// </summary>
+		/// <typeparam name="TArg1">参数类型</typeparam>
+		/// <typeparam name="TArg2">参数类型</typeparam>
+		/// <typeparam name="T"></typeparam>
+		/// <param name="type">实例类型</param>
+		/// <param name="argument1">参数值</param>
+		/// <param name="argument2">参数值</param>
+		/// <returns></returns>
+		public static T GetInstance<TArg1, TArg2, T>(string type, TArg1 argument1, TArg2 argument2) where T : class, new()
+		{
+			return GetInstance<TArg1, TArg2, TypeToIgnore, T>(Type.GetType(type), argument1, argument2, null);
+		}
+
+		/// <summary>
+		/// 获取3个构造参数的实例
+		/// </summary>
+		/// <typeparam name="TArg1">参数类型</typeparam>
+		/// <typeparam name="TArg2">参数类型</typeparam>
+		/// <typeparam name="TArg3">参数类型</typeparam>
+		/// <typeparam name="T"></typeparam>
+		/// <param name="type">实例类型</param>
+		/// <param name="argument1">参数值</param>
+		/// <param name="argument2">参数值</param>
+		/// <param name="argument3">参数值</param>
+		/// <returns></returns>
+		public static T GetInstance<TArg1, TArg2, TArg3, T>(this Type type, TArg1 argument1, TArg2 argument2, TArg3 argument3) where T : class, new()
+		{
+			return InstanceCreationFactory<TArg1, TArg2, TArg3, T>.CreateInstanceOf(type, argument1, argument2, argument3);
+		}
+
+		/// <summary>
+		/// 获取3个构造参数的实例
+		/// </summary>
+		/// <typeparam name="TArg1">参数类型</typeparam>
+		/// <typeparam name="TArg2">参数类型</typeparam>
+		/// <typeparam name="TArg3">参数类型</typeparam>
+		/// <typeparam name="T"></typeparam>
+		/// <param name="type">实例类型</param>
+		/// <param name="argument1">参数值</param>
+		/// <param name="argument2">参数值</param>
+		/// <param name="argument3">参数值</param>
+		/// <returns></returns>
+		public static T GetInstance<TArg1, TArg2, TArg3, T>(string type, TArg1 argument1, TArg2 argument2, TArg3 argument3) where T : class, new()
+		{
+			return InstanceCreationFactory<TArg1, TArg2, TArg3, T>.CreateInstanceOf(Type.GetType(type), argument1, argument2, argument3);
+		}
+
+		private class TypeToIgnore
+		{
+		}
+
+		private static class InstanceCreationFactory<TArg1, TArg2, TArg3, TObject> where TObject : class, new()
+		{
+			private static readonly Dictionary<Type, Func<TArg1, TArg2, TArg3, TObject>> InstanceCreationMethods = new Dictionary<Type, Func<TArg1, TArg2, TArg3, TObject>>();
+
+			public static TObject CreateInstanceOf(Type type, TArg1 arg1, TArg2 arg2, TArg3 arg3)
+			{
+				CacheInstanceCreationMethodIfRequired(type);
+
+				return InstanceCreationMethods[type](arg1, arg2, arg3);
+			}
+
+			private static void CacheInstanceCreationMethodIfRequired(Type type)
+			{
+				if (InstanceCreationMethods.ContainsKey(type))
+				{
+					return;
+				}
+
+				var argumentTypes = new[]
+				{
+					typeof(TArg1),
+					typeof(TArg2),
+					typeof(TArg3)
+				};
+
+				Type[] constructorArgumentTypes = argumentTypes.Where(t => t != typeof(TypeToIgnore)).ToArray();
+				var constructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null, CallingConventions.HasThis, constructorArgumentTypes, new ParameterModifier[0]);
+
+				var lamdaParameterExpressions = new[]
+				{
+					Expression.Parameter(typeof(TArg1), "param1"),
+					Expression.Parameter(typeof(TArg2), "param2"),
+					Expression.Parameter(typeof(TArg3), "param3")
+				};
+
+				var constructorParameterExpressions = lamdaParameterExpressions.Take(constructorArgumentTypes.Length).ToArray();
+				var constructorCallExpression = Expression.New(constructor, constructorParameterExpressions);
+				var constructorCallingLambda = Expression.Lambda<Func<TArg1, TArg2, TArg3, TObject>>(constructorCallExpression, lamdaParameterExpressions).Compile();
+				InstanceCreationMethods[type] = constructorCallingLambda;
+			}
+		}
+
+		#endregion 创建实例
+	}
 }
 }

+ 4 - 4
Masuit.Tools.AspNetCore/Masuit.Tools.AspNetCore.csproj

@@ -18,7 +18,7 @@
         <Product>Masuit.Tools.AspNetCore</Product>
         <Product>Masuit.Tools.AspNetCore</Product>
         <PackageId>Masuit.Tools.AspNetCore</PackageId>
         <PackageId>Masuit.Tools.AspNetCore</PackageId>
         <LangVersion>latest</LangVersion>
         <LangVersion>latest</LangVersion>
-        <Version>1.2.2.1</Version>
+        <Version>1.2.2.2</Version>
         <RepositoryType></RepositoryType>
         <RepositoryType></RepositoryType>
         <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
         <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
         <FileVersion>1.1.9</FileVersion>
         <FileVersion>1.1.9</FileVersion>
@@ -53,13 +53,13 @@
     </ItemGroup>
     </ItemGroup>
     
     
     <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.1'">
     <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.1'">
-        <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[3.1.9]" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[3.1.32]" />
     </ItemGroup>
     </ItemGroup>
     <ItemGroup Condition=" '$(TargetFramework)' == 'net5'">
     <ItemGroup Condition=" '$(TargetFramework)' == 'net5'">
-        <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[5.0.11]" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[5.0.17]" />
     </ItemGroup>
     </ItemGroup>
     <ItemGroup Condition=" '$(TargetFramework)' == 'net6'">
     <ItemGroup Condition=" '$(TargetFramework)' == 'net6'">
-        <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[6.0.10]" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[6.0.16]" />
     </ItemGroup>
     </ItemGroup>
     <ItemGroup Condition=" '$(TargetFramework)' == 'net7'">
     <ItemGroup Condition=" '$(TargetFramework)' == 'net7'">
         <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.5" />
         <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.5" />

+ 5 - 5
Masuit.Tools.Core/Masuit.Tools.Core.csproj

@@ -6,7 +6,7 @@
 官网教程:https://ldqk.org/55
 官网教程:https://ldqk.org/55
 github:https://github.com/ldqk/Masuit.Tools
 github:https://github.com/ldqk/Masuit.Tools
         </Description>
         </Description>
-        <Version>2.6.2.1</Version>
+        <Version>2.6.2.2</Version>
         <Copyright>Copyright © 懒得勤快</Copyright>
         <Copyright>Copyright © 懒得勤快</Copyright>
         <PackageProjectUrl>https://github.com/ldqk/Masuit.Tools</PackageProjectUrl>
         <PackageProjectUrl>https://github.com/ldqk/Masuit.Tools</PackageProjectUrl>
         <PackageTags>Masuit.Tools,工具库,Utility,Crypt,Extensions</PackageTags>
         <PackageTags>Masuit.Tools,工具库,Utility,Crypt,Extensions</PackageTags>
@@ -39,16 +39,16 @@ github:https://github.com/ldqk/Masuit.Tools
     </ItemGroup>
     </ItemGroup>
 
 
     <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0'">
     <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0'">
-        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="[2.1.1]" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="[2.2.6]" />
     </ItemGroup>
     </ItemGroup>
     <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.1'">
     <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.1'">
-        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="[3.1.9]" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="[3.1.32]" />
     </ItemGroup>
     </ItemGroup>
     <ItemGroup Condition=" '$(TargetFramework)' == 'net5'">
     <ItemGroup Condition=" '$(TargetFramework)' == 'net5'">
-        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="[5.0.11]" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="[5.0.17]" />
     </ItemGroup>
     </ItemGroup>
     <ItemGroup Condition=" '$(TargetFramework)' == 'net6'">
     <ItemGroup Condition=" '$(TargetFramework)' == 'net6'">
-        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="[6.0.10]" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="[6.0.16]" />
     </ItemGroup>
     </ItemGroup>
     <ItemGroup Condition=" '$(TargetFramework)' == 'net7'">
     <ItemGroup Condition=" '$(TargetFramework)' == 'net7'">
         <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
         <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />

+ 1 - 1
Masuit.Tools.Excel/Masuit.Tools.Excel.csproj

@@ -3,7 +3,7 @@
         <TargetFramework>netstandard2.0</TargetFramework>
         <TargetFramework>netstandard2.0</TargetFramework>
         <LangVersion>latest</LangVersion>
         <LangVersion>latest</LangVersion>
         <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
         <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-        <Version>1.2.5.7</Version>
+        <Version>1.2.5.8</Version>
         <Authors>懒得勤快</Authors>
         <Authors>懒得勤快</Authors>
         <Description>Masuit.Tools.Excel导出库,支持一些简单数据的导出,支持图片列</Description>
         <Description>Masuit.Tools.Excel导出库,支持一些简单数据的导出,支持图片列</Description>
         <Copyright>懒得勤快</Copyright>
         <Copyright>懒得勤快</Copyright>

+ 1 - 1
Masuit.Tools/package.nuspec

@@ -2,7 +2,7 @@
 <package>
 <package>
   <metadata>
   <metadata>
     <id>Masuit.Tools.Net</id>
     <id>Masuit.Tools.Net</id>
-    <version>2.6.2</version>
+    <version>2.6.2.2</version>
     <title>Masuit.Tools</title>
     <title>Masuit.Tools</title>
     <authors>懒得勤快</authors>
     <authors>懒得勤快</authors>
     <owners>masuit.com</owners>
     <owners>masuit.com</owners>

+ 1 - 1
Test/Masuit.Tools.Abstractions.Test/Masuit.Tools.Abstractions.Test.csproj

@@ -13,7 +13,7 @@
   </ItemGroup>
   </ItemGroup>
 
 
   <ItemGroup>
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.2" />
     <PackageReference Include="xunit" Version="2.4.2" />
     <PackageReference Include="xunit" Version="2.4.2" />
     <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
     <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
       <PrivateAssets>all</PrivateAssets>
       <PrivateAssets>all</PrivateAssets>

+ 1 - 1
Test/Masuit.Tools.Core.Test/Masuit.Tools.Core.Test.csproj

@@ -11,7 +11,7 @@
   <ItemGroup>
   <ItemGroup>
     <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="7.0.5" />
     <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="7.0.5" />
     <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
     <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.2" />
     <PackageReference Include="xunit" Version="2.4.2" />
     <PackageReference Include="xunit" Version="2.4.2" />
     <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
     <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
       <PrivateAssets>all</PrivateAssets>
       <PrivateAssets>all</PrivateAssets>

+ 2 - 2
Test/Masuit.Tools.Test/Masuit.Tools.Test.csproj

@@ -97,10 +97,10 @@
       <Version>4.18.4</Version>
       <Version>4.18.4</Version>
     </PackageReference>
     </PackageReference>
     <PackageReference Include="MSTest.TestAdapter">
     <PackageReference Include="MSTest.TestAdapter">
-      <Version>3.0.3</Version>
+      <Version>3.0.4</Version>
     </PackageReference>
     </PackageReference>
     <PackageReference Include="MSTest.TestFramework">
     <PackageReference Include="MSTest.TestFramework">
-      <Version>3.0.3</Version>
+      <Version>3.0.4</Version>
     </PackageReference>
     </PackageReference>
     <PackageReference Include="NUnit">
     <PackageReference Include="NUnit">
       <Version>3.13.3</Version>
       <Version>3.13.3</Version>