|
|
@@ -1,4 +1,5 @@
|
|
|
-using SqlSugar;
|
|
|
+using FreeRedis;
|
|
|
+using SqlSugar;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.ComponentModel;
|
|
|
@@ -6,12 +7,13 @@ using System.Data;
|
|
|
using System.Linq;
|
|
|
using System.Reflection;
|
|
|
using System.Security.Cryptography;
|
|
|
+using System.Text;
|
|
|
using WCS.Core.Log;
|
|
|
|
|
|
namespace WCS.Core.BaseExtensions
|
|
|
{
|
|
|
/// <summary>
|
|
|
- ///
|
|
|
+ /// 类型转换扩展
|
|
|
/// </summary>
|
|
|
public static class TypeExtension
|
|
|
{
|
|
|
@@ -84,13 +86,13 @@ namespace WCS.Core.BaseExtensions
|
|
|
/// <returns></returns>
|
|
|
public static D Mapper<D, S>(S s)
|
|
|
{
|
|
|
- D d = Activator.CreateInstance<D>();
|
|
|
+ var d = Activator.CreateInstance<D>();
|
|
|
|
|
|
- var sType = s.GetType();
|
|
|
+ var sType = s?.GetType();
|
|
|
var dType = typeof(D);
|
|
|
- foreach (PropertyInfo sP in sType.GetProperties())
|
|
|
+ foreach (var sP in sType.GetProperties())
|
|
|
{
|
|
|
- foreach (PropertyInfo dP in dType.GetProperties())
|
|
|
+ foreach (var dP in dType.GetProperties())
|
|
|
{
|
|
|
if (dP.Name == sP.Name)
|
|
|
{
|
|
|
@@ -112,11 +114,11 @@ namespace WCS.Core.BaseExtensions
|
|
|
/// <returns></returns>
|
|
|
public static Dictionary<string, object> EntityClassToDictionary<T>(T t)
|
|
|
{
|
|
|
- Type type = typeof(SugarColumn);
|
|
|
+ var type = typeof(SugarColumn);
|
|
|
Dictionary<string, object> d = new Dictionary<string, object>();
|
|
|
|
|
|
var sType = t.GetType();
|
|
|
- foreach (PropertyInfo sP in sType.GetProperties())
|
|
|
+ foreach (var sP in sType.GetProperties())
|
|
|
{
|
|
|
if (sP.CustomAttributes.Any(v => v.AttributeType == type) && sP.Name != "VER" && sP.Name != "ID")
|
|
|
{
|
|
|
@@ -134,12 +136,12 @@ namespace WCS.Core.BaseExtensions
|
|
|
/// <returns></returns>
|
|
|
public static string GetMD5(this string myString)
|
|
|
{
|
|
|
- MD5 md5 = MD5.Create();
|
|
|
- byte[] fromData = System.Text.Encoding.Unicode.GetBytes(myString);
|
|
|
- byte[] targetData = md5.ComputeHash(fromData);
|
|
|
+ var md5 = MD5.Create();
|
|
|
+ var fromData = System.Text.Encoding.Unicode.GetBytes(myString);
|
|
|
+ var targetData = md5.ComputeHash(fromData);
|
|
|
string byte2String = null;
|
|
|
|
|
|
- for (int i = 0; i < targetData.Length; i++)
|
|
|
+ for (var i = 0; i < targetData.Length; i++)
|
|
|
{
|
|
|
byte2String += targetData[i].ToString("x");
|
|
|
}
|
|
|
@@ -155,15 +157,15 @@ namespace WCS.Core.BaseExtensions
|
|
|
/// <returns></returns>
|
|
|
public static List<object> TableToEntity(this DataTable dt, string typeName)
|
|
|
{
|
|
|
- List<object> list = new List<object>();
|
|
|
+ var list = new List<object>();
|
|
|
try
|
|
|
{
|
|
|
foreach (DataRow row in dt.Rows)
|
|
|
{
|
|
|
- Type entity = Type.GetType(typeName);
|
|
|
+ var entity = Type.GetType(typeName);
|
|
|
PropertyInfo[] pArray = entity.GetType().GetProperties();
|
|
|
|
|
|
- foreach (PropertyInfo p in pArray)
|
|
|
+ foreach (var p in pArray)
|
|
|
{
|
|
|
if (dt.Columns.Contains(p.Name))
|
|
|
{
|
|
|
@@ -171,12 +173,12 @@ namespace WCS.Core.BaseExtensions
|
|
|
var value = row[p.Name];
|
|
|
if (value != DBNull.Value)
|
|
|
{
|
|
|
- Type targetType = p.PropertyType;
|
|
|
- Type convertType = targetType;
|
|
|
+ var targetType = p.PropertyType;
|
|
|
+ var convertType = targetType;
|
|
|
if (targetType.IsGenericType && targetType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
|
|
|
{
|
|
|
//可空类型
|
|
|
- NullableConverter nullableConverter = new NullableConverter(targetType);
|
|
|
+ var nullableConverter = new NullableConverter(targetType);
|
|
|
convertType = nullableConverter.UnderlyingType;
|
|
|
}
|
|
|
if (!string.IsNullOrEmpty(convertType.FullName) && !string.IsNullOrEmpty(value.ToString()))
|
|
|
@@ -233,5 +235,152 @@ namespace WCS.Core.BaseExtensions
|
|
|
}
|
|
|
return list;
|
|
|
}
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 对象转换成二进制流
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="obj"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static byte[] ObjectToByte(this object obj)
|
|
|
+ {
|
|
|
+ var stream = new System.IO.MemoryStream();
|
|
|
+ System.Runtime.Serialization.IFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
|
|
|
+ bf.Serialize(stream, obj);
|
|
|
+ var bytes = stream.GetBuffer();
|
|
|
+ stream.Close();
|
|
|
+ return bytes;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 反序列化二进制
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="valueRaw"></param>
|
|
|
+ /// <param name="encoding"></param>
|
|
|
+ /// <typeparam name="T"></typeparam>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static T DeserializeRedisValue<T>(byte[] valueRaw, Encoding encoding)
|
|
|
+ {
|
|
|
+ if (valueRaw == null) return default(T);
|
|
|
+ var type = typeof(T);
|
|
|
+ var typename = type.ToString().TrimEnd(']');
|
|
|
+ switch (typename)
|
|
|
+ {
|
|
|
+ case "System.Byte[":
|
|
|
+ return (T)Convert.ChangeType(valueRaw, type);
|
|
|
+ case "System.String":
|
|
|
+ return (T)Convert.ChangeType(encoding.GetString(valueRaw), type);
|
|
|
+ case "System.Boolean[":
|
|
|
+ return (T)Convert.ChangeType(valueRaw.Select(a => a == 49).ToArray(), type);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (valueRaw.Length == 0) return default(T);
|
|
|
+
|
|
|
+ string valueStr = null;
|
|
|
+ if (type.IsValueType)
|
|
|
+ {
|
|
|
+ valueStr = encoding.GetString(valueRaw);
|
|
|
+ var isNullable = typename.StartsWith("System.Nullable`1[");
|
|
|
+ var basename = isNullable ? typename.Substring(18) : typename;
|
|
|
+
|
|
|
+ var isElse = false;
|
|
|
+ object obj = null;
|
|
|
+ switch (basename)
|
|
|
+ {
|
|
|
+ case "System.Boolean":
|
|
|
+ obj = valueStr switch
|
|
|
+ {
|
|
|
+ "1" => true,
|
|
|
+ "0" => false,
|
|
|
+ _ => obj
|
|
|
+ };
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.Byte":
|
|
|
+ if (byte.TryParse(valueStr, out var trybyte)) obj = trybyte;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.Char":
|
|
|
+ if (valueStr.Length > 0) obj = valueStr[0];
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.Decimal":
|
|
|
+ if (Decimal.TryParse(valueStr, out var trydec)) obj = trydec;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.Double":
|
|
|
+ if (Double.TryParse(valueStr, out var trydb)) obj = trydb;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.Single":
|
|
|
+ if (Single.TryParse(valueStr, out var trysg)) obj = trysg;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.Int32":
|
|
|
+ if (Int32.TryParse(valueStr, out var tryint32)) obj = tryint32;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.Int64":
|
|
|
+ if (Int64.TryParse(valueStr, out var tryint64)) obj = tryint64;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.SByte":
|
|
|
+ if (SByte.TryParse(valueStr, out var trysb)) obj = trysb;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.Int16":
|
|
|
+ if (Int16.TryParse(valueStr, out var tryint16)) obj = tryint16;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.UInt32":
|
|
|
+ if (UInt32.TryParse(valueStr, out var tryuint32)) obj = tryuint32;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.UInt64":
|
|
|
+ if (UInt64.TryParse(valueStr, out var tryuint64)) obj = tryuint64;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.UInt16":
|
|
|
+ if (UInt16.TryParse(valueStr, out var tryuint16)) obj = tryuint16;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.DateTime":
|
|
|
+ if (DateTime.TryParse(valueStr, out var trydt)) obj = trydt;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.DateTimeOffset":
|
|
|
+ if (DateTimeOffset.TryParse(valueStr, out var trydtos)) obj = trydtos;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.TimeSpan":
|
|
|
+ if (Int64.TryParse(valueStr, out tryint64)) obj = new TimeSpan(tryint64);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "System.Guid":
|
|
|
+ if (Guid.TryParse(valueStr, out var tryguid)) obj = tryguid;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ isElse = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isElse == false)
|
|
|
+ {
|
|
|
+ if (obj == null) return default(T);
|
|
|
+ return (T)obj;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ valueStr ??= encoding.GetString(valueRaw);
|
|
|
+ return valueStr.ConvertTo<T>();
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 转换到目标类型
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="value"></param>
|
|
|
+ /// <typeparam name="T"></typeparam>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static T ConvertTo<T>(this object value) => (T)typeof(T).FromObject(value);
|
|
|
}
|
|
|
}
|