多项功能优化
This commit is contained in:
@@ -8,148 +8,134 @@ namespace Sai.Toolkit.Core.Extensions;
|
||||
|
||||
public static class DataTableExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取数据
|
||||
/// </summary>
|
||||
/// <param name="dt"></param>
|
||||
/// <param name="row"></param>
|
||||
/// <param name="column"></param>
|
||||
/// <returns></returns>
|
||||
public static string GetValue(this DataTable dt, int row, int column)
|
||||
{
|
||||
return dt != null ? dt.Rows[row][column].ToString() : string.Empty;
|
||||
}
|
||||
|
||||
{
|
||||
return dt != null ? dt.Rows[row][column].ToString() : string.Empty;
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取值
|
||||
/// </summary>
|
||||
/// <param name="dr"></param>
|
||||
/// <param name="column"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="ArgumentNullException"></exception>
|
||||
public static string GetValue(this DataRow dr, int column)
|
||||
{
|
||||
return dr == null ? throw new ArgumentNullException() : dr[column].ToString();
|
||||
}
|
||||
|
||||
{
|
||||
return dr == null ? throw new ArgumentNullException(nameof(dr)) : dr[column].ToString();
|
||||
}
|
||||
/// <summary>
|
||||
/// 设置值
|
||||
/// </summary>
|
||||
/// <param name="dt"></param>
|
||||
/// <param name="row"></param>
|
||||
/// <param name="column"></param>
|
||||
/// <param name="value"></param>
|
||||
public static void SetValue(this DataTable dt, int row, int column, object value)
|
||||
{
|
||||
dt.Rows[row][column] = value;
|
||||
}
|
||||
|
||||
{
|
||||
dt.Rows[row][column] = value;
|
||||
}
|
||||
/// <summary>
|
||||
/// 设置值
|
||||
/// </summary>
|
||||
/// <param name="dr"></param>
|
||||
/// <param name="column"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <exception cref="ArgumentNullException"></exception>
|
||||
public static void SetValue(this DataRow dr, int column, object value)
|
||||
{
|
||||
if (dr == null)
|
||||
{
|
||||
throw new ArgumentNullException();
|
||||
}
|
||||
{
|
||||
if (dr == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(dr));
|
||||
}
|
||||
|
||||
dr[column] = value;
|
||||
}
|
||||
dr[column] = value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 转实体,属性名必须与列名相同
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="table"></param>
|
||||
/// <returns></returns>
|
||||
public static List<T> ToEntities<T>(this DataTable table)
|
||||
where T : new()
|
||||
{
|
||||
var entities = new List<T>();
|
||||
if (table == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
/// <summary>
|
||||
/// 转实体,属性名必须与列名相同
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="table"></param>
|
||||
/// <returns></returns>
|
||||
public static List<T> ToEntities<T>(this DataTable table)
|
||||
where T : new()
|
||||
{
|
||||
var entities = new List<T>();
|
||||
if (table == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
foreach (DataRow row in table.Rows)
|
||||
{
|
||||
T entity = new();
|
||||
foreach (var item in entity.GetType().GetProperties())
|
||||
{
|
||||
if (table.Columns.Contains(item.Name))
|
||||
{
|
||||
if (DBNull.Value != row[item.Name])
|
||||
{
|
||||
var newType = item.PropertyType;
|
||||
//判断type类型是否为泛型,因为nullable是泛型类,
|
||||
if (newType.IsGenericType && newType.GetGenericTypeDefinition() == typeof(Nullable<>)) //判断convertsionType是否为nullable泛型类
|
||||
{
|
||||
//如果type为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
|
||||
var nullableConverter = new System.ComponentModel.NullableConverter(newType);
|
||||
//将type转换为nullable对的基础基元类型
|
||||
newType = nullableConverter.UnderlyingType;
|
||||
}
|
||||
foreach (DataRow row in table.Rows)
|
||||
{
|
||||
T entity = new();
|
||||
foreach (var item in entity.GetType().GetProperties())
|
||||
{
|
||||
if (table.Columns.Contains(item.Name))
|
||||
{
|
||||
if (DBNull.Value != row[item.Name])
|
||||
{
|
||||
var newType = item.PropertyType;
|
||||
//判断type类型是否为泛型,因为nullable是泛型类,
|
||||
if (newType.IsGenericType && newType.GetGenericTypeDefinition() == typeof(Nullable<>)) //判断convertsionType是否为nullable泛型类
|
||||
{
|
||||
//如果type为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
|
||||
var nullableConverter = new System.ComponentModel.NullableConverter(newType);
|
||||
//将type转换为nullable对的基础基元类型
|
||||
newType = nullableConverter.UnderlyingType;
|
||||
}
|
||||
|
||||
item.SetValue(entity, Convert.ChangeType(row[item.Name], newType), null);
|
||||
}
|
||||
}
|
||||
}
|
||||
item.SetValue(entity, Convert.ChangeType(row[item.Name], newType), null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
entities.Add(entity);
|
||||
}
|
||||
entities.Add(entity);
|
||||
}
|
||||
|
||||
return entities;
|
||||
}
|
||||
return entities;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将指定的集合转换成DataTable。
|
||||
/// </summary>
|
||||
/// <param name="list">将指定的集合。</param>
|
||||
/// <returns>返回转换后的DataTable。</returns>
|
||||
public static DataTable ToDataTable(IList list)
|
||||
{
|
||||
var table = new DataTable();
|
||||
if (list.Count > 0)
|
||||
{
|
||||
var properties = list[0].GetType().GetProperties();
|
||||
foreach (var pi in properties)
|
||||
{
|
||||
var pt = pi.PropertyType;
|
||||
if (pt.IsGenericType && pt.GetGenericTypeDefinition() == typeof(Nullable<>))
|
||||
{
|
||||
pt = pt.GetGenericArguments()[0];
|
||||
}
|
||||
/// <summary>
|
||||
/// 将指定的集合转换成DataTable。
|
||||
/// </summary>
|
||||
/// <param name="list">将指定的集合。</param>
|
||||
/// <returns>返回转换后的DataTable。</returns>
|
||||
public static DataTable ToDataTable(this IList list)
|
||||
{
|
||||
var table = new DataTable();
|
||||
|
||||
table.Columns.Add(new DataColumn(pi.Name, pt));
|
||||
}
|
||||
var properties = list[0].GetType().GetProperties();
|
||||
foreach (var pi in properties)
|
||||
{
|
||||
var pt = pi.PropertyType;
|
||||
if (pt.IsGenericType && pt.GetGenericTypeDefinition() == typeof(Nullable<>))
|
||||
{
|
||||
pt = pt.GetGenericArguments()[0];
|
||||
}
|
||||
|
||||
for (var i = 0; i < list.Count; i++)
|
||||
{
|
||||
var tempList = new ArrayList();
|
||||
foreach (var pi in properties)
|
||||
{
|
||||
var obj = pi.GetValue(list[i], null);
|
||||
tempList.Add(obj);
|
||||
}
|
||||
table.Columns.Add(new DataColumn(pi.Name, pt));
|
||||
}
|
||||
|
||||
var array = tempList.ToArray();
|
||||
table.LoadDataRow(array, true);
|
||||
}
|
||||
}
|
||||
for (var i = 0; i < list.Count; i++)
|
||||
{
|
||||
var tempList = new ArrayList();
|
||||
foreach (var pi in properties)
|
||||
{
|
||||
var obj = pi.GetValue(list[i], null);
|
||||
tempList.Add(obj);
|
||||
}
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
public static DataTable ToDataTable<T>(this List<T> list)
|
||||
{
|
||||
var table = new DataTable();
|
||||
//创建列头
|
||||
var properties = typeof(T).GetProperties();
|
||||
foreach (var pi in properties)
|
||||
{
|
||||
var pt = pi.PropertyType;
|
||||
if (pt.IsGenericType && pt.GetGenericTypeDefinition() == typeof(Nullable<>))
|
||||
{
|
||||
pt = pt.GetGenericArguments()[0];
|
||||
}
|
||||
|
||||
table.Columns.Add(new DataColumn(pi.Name, pt));
|
||||
}
|
||||
|
||||
//创建数据行
|
||||
if (list.Count > 0)
|
||||
{
|
||||
for (var i = 0; i < list.Count; i++)
|
||||
{
|
||||
var tempList = new ArrayList();
|
||||
foreach (var pi in properties)
|
||||
{
|
||||
var obj = pi.GetValue(list[i], null);
|
||||
tempList.Add(obj);
|
||||
}
|
||||
|
||||
var array = tempList.ToArray();
|
||||
table.LoadDataRow(array, true);
|
||||
}
|
||||
}
|
||||
|
||||
return table;
|
||||
}
|
||||
var array = tempList.ToArray();
|
||||
table.LoadDataRow(array, true);
|
||||
}
|
||||
return table;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,10 +10,15 @@ namespace Sai.Toolkit.Core.Extensions;
|
||||
|
||||
public static class ImageExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// 提取资源
|
||||
/// </summary>
|
||||
/// <param name="resourceName"></param>
|
||||
/// <param name="path"></param>
|
||||
public static void ExtractResource(string resourceName, string path)
|
||||
{
|
||||
using var manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName);
|
||||
using Stream stream = File.Create(path);
|
||||
using var stream = File.Create(path);
|
||||
var array = new byte[8192];
|
||||
int count;
|
||||
while ((count = manifestResourceStream.Read(array, 0, array.Length)) > 0)
|
||||
@@ -34,7 +39,12 @@ public static class ImageExtensions
|
||||
var bm = WindowsThumbnailProvider.GetThumbnail(filename, width, height, ThumbnailOptions.None);
|
||||
return Imaging.CreateBitmapSourceFromHBitmap(bm.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 位图转图片
|
||||
/// </summary>
|
||||
/// <param name="bitmap"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="ArgumentNullException"></exception>
|
||||
public static BitmapImage ToBitmapImage(this Bitmap bitmap)
|
||||
{
|
||||
if (bitmap is null)
|
||||
@@ -59,13 +69,18 @@ public static class ImageExtensions
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 位图转像素集
|
||||
/// </summary>
|
||||
/// <param name="bitmap"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="ArgumentNullException"></exception>
|
||||
public static BitmapSource ToBitmapSource(this Bitmap bitmap)
|
||||
{
|
||||
if (bitmap == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
throw new ArgumentNullException(nameof(bitmap));
|
||||
}
|
||||
return Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace Sai.Toolkit.Core.Helpers
|
||||
/// <summary>
|
||||
/// 获取项目文件夹下的配置文件根据Key获取Value
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="key">键</param>
|
||||
/// <returns></returns>
|
||||
public static string GetCfgValue(string key)
|
||||
{
|
||||
@@ -25,8 +25,8 @@ namespace Sai.Toolkit.Core.Helpers
|
||||
/// <summary>
|
||||
/// 保存到程序目录下的配置文件
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="key">键</param>
|
||||
/// <param name="value">值</param>
|
||||
public static void SetCfgPairs(string key, string value)
|
||||
{
|
||||
var assembly = Assembly.GetCallingAssembly();
|
||||
|
||||
@@ -6,170 +6,14 @@ namespace Sai.Toolkit.Core.Helpers;
|
||||
|
||||
public static class EnumHelpers
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取当前枚举的值和枚举描述
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static List<KeyValuePair<int, string>> GetAll<T>()
|
||||
where T : IComparable, IFormattable, IConvertible
|
||||
{
|
||||
var list = new List<KeyValuePair<int, string>>();
|
||||
foreach (var field in typeof(T).GetFields())
|
||||
{
|
||||
if (field.FieldType.IsEnum)
|
||||
{
|
||||
var tmp = field.GetValue(null);
|
||||
var enumValue = (Enum)tmp;
|
||||
var intValue = Convert.ToInt32(enumValue);
|
||||
var showName = enumValue.GetDescription();
|
||||
list.Add(new KeyValuePair<int, string>(intValue, showName));
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前枚举值的描述,没有描述则返回空字符串
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public static string GetDescription(this Enum value)
|
||||
{
|
||||
var description = string.Empty;
|
||||
var fieldInfo = value.GetType().GetField(value.ToString());
|
||||
var attr = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
|
||||
if (attr != null)
|
||||
{
|
||||
description = attr.Description;
|
||||
}
|
||||
|
||||
return description;
|
||||
}
|
||||
|
||||
public static Dictionary<string, T> GetDescriptionEnumMap<T>()
|
||||
where T : Enum
|
||||
{
|
||||
var results = new Dictionary<string, T>();
|
||||
|
||||
var values = Enum.GetValues(typeof(T));
|
||||
|
||||
foreach (T value in values)
|
||||
{
|
||||
var member = typeof(T).GetMember(value.ToString()).FirstOrDefault();
|
||||
|
||||
if (member is null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var customAttributes = member.GetCustomAttributes(typeof(DescriptionAttribute), false);
|
||||
|
||||
var name = (customAttributes.FirstOrDefault() as DescriptionAttribute)?.Description;
|
||||
|
||||
if (name != null)
|
||||
{
|
||||
results.Add(name, value);
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
public static Dictionary<string, T> GetDisplayEnumDict<T>()
|
||||
where T : Enum
|
||||
{
|
||||
var results = new Dictionary<string, T>();
|
||||
|
||||
var values = Enum.GetValues(typeof(T));
|
||||
|
||||
foreach (T value in values)
|
||||
{
|
||||
var member = typeof(T).GetMember(value.ToString()).FirstOrDefault();
|
||||
|
||||
if (member is null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var atts = member.GetCustomAttributes(typeof(DisplayAttribute), false);
|
||||
|
||||
var name = (atts.FirstOrDefault() as DisplayAttribute)?.Name;
|
||||
|
||||
if (name != null)
|
||||
{
|
||||
results.Add(name, value);
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取描述的扩展方法
|
||||
/// </summary>
|
||||
/// <param name="enumObj"></param>
|
||||
/// <param name="value">枚举值</param>
|
||||
/// <returns></returns>
|
||||
public static string GetEnumDescription(this Enum enumObj, int? value)
|
||||
{
|
||||
var fields = enumObj.GetType().GetFields();
|
||||
for (int i = 1, count = fields.Length; i < count; i++)
|
||||
{
|
||||
if ((int)Enum.Parse(enumObj.GetType(), fields[i].Name) == value)
|
||||
{
|
||||
var enumAttributes = (DescriptionAttribute[])fields[i].GetCustomAttributes(typeof(DescriptionAttribute), false);
|
||||
if (enumAttributes.Length > 0)
|
||||
{
|
||||
return enumAttributes[0].Description;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
private static void GetInfo(Type enumType)
|
||||
{
|
||||
_ = Enum.GetValues(enumType); //得到的是枚举类型,用于遍历枚举类
|
||||
|
||||
_ = Enum.GetNames(enumType); //得到的是枚举类的字符串
|
||||
}
|
||||
|
||||
public static List<string> TraverseEnum<T>()
|
||||
{
|
||||
List<string> pName = new();
|
||||
foreach (T p in Enum.GetValues(typeof(T)))
|
||||
{
|
||||
pName.Add(p.ToString());
|
||||
}
|
||||
|
||||
return pName;
|
||||
}
|
||||
|
||||
public static bool TryParseByDescAttr<T>(string value, out T result)
|
||||
where T : Enum
|
||||
{
|
||||
if (value is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(value));
|
||||
}
|
||||
|
||||
var descs = GetDescriptionEnumMap<T>();
|
||||
|
||||
return !descs.TryGetValue(value, out result) ? throw new InvalidEnumArgumentException() : true;
|
||||
}
|
||||
|
||||
public static bool TryParseByDisplayAttr<T>(string value, out T result)
|
||||
where T : Enum
|
||||
{
|
||||
if (value is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(value));
|
||||
}
|
||||
|
||||
var dict = GetDisplayEnumDict<T>();
|
||||
|
||||
return !dict.TryGetValue(value, out result) ? throw new InvalidEnumArgumentException() : true;
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取当前枚举值的描述,没有描述则返回空字符串
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public static T GetAttribute<T>(this Enum value) where T : Attribute
|
||||
{
|
||||
var fieldInfo = value.GetType().GetField(value.ToString());
|
||||
return fieldInfo.GetCustomAttribute<T>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,11 +17,12 @@ public static class WinDialogHelper
|
||||
/// <param name="filterName">过滤器的名称</param>
|
||||
/// <param name="extensions">仅扩展名,*代表所有文件</param>
|
||||
/// <returns></returns>
|
||||
public static string CreateFilter(string filterName, params string[] extensions)
|
||||
public static FileDialog SetFilter(this FileDialog dialog, string filterName, params string[] extensions)
|
||||
{
|
||||
if (extensions[0] == "*")
|
||||
{
|
||||
return "所有文件(*)|*";
|
||||
dialog.Filter = "所有文件(*)|*";
|
||||
//return "所有文件(*)|*";
|
||||
}
|
||||
|
||||
var str = string.Empty;
|
||||
@@ -34,8 +35,9 @@ public static class WinDialogHelper
|
||||
str += ";";
|
||||
}
|
||||
}
|
||||
|
||||
return $"{filterName}({str})|{str}";
|
||||
dialog.Filter = $"{filterName}({str})|{str}";
|
||||
return dialog;
|
||||
//return $"{filterName}({str})|{str}";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -50,9 +52,10 @@ public static class WinDialogHelper
|
||||
new()
|
||||
{
|
||||
CheckFileExists = true,
|
||||
Filter = CreateFilter(title, extensions),
|
||||
|
||||
InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
|
||||
};
|
||||
dialog.SetFilter(title, extensions);
|
||||
return dialog.ShowDialog() == true ? dialog.FileName : null;
|
||||
}
|
||||
|
||||
@@ -93,6 +96,7 @@ public static class WinDialogHelper
|
||||
public static void ShowModeless<T>(ObservableObject viewModel)
|
||||
where T : Window, new()
|
||||
{
|
||||
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomainOnAssemblyResolve;
|
||||
var view = SingletonViewHelper<T>.GetInstance(out var isNewCreate);
|
||||
if (isNewCreate)
|
||||
{
|
||||
@@ -100,6 +104,8 @@ public static class WinDialogHelper
|
||||
view.ShowAhead();
|
||||
}
|
||||
view.Activate();
|
||||
AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomainOnAssemblyResolve;
|
||||
|
||||
//AssemblyLoaderHelpers loaderUtil = new(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
|
||||
//loaderUtil.HookAssemblyResolve();
|
||||
//try
|
||||
@@ -121,6 +127,19 @@ public static class WinDialogHelper
|
||||
// loaderUtil.UnhookAssemblyResolve();
|
||||
//}
|
||||
}
|
||||
private static Assembly CurrentDomainOnAssemblyResolve(object sender, ResolveEventArgs args)
|
||||
{
|
||||
if (!args.Name.Contains("Xaml.Behaviors"))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var assemblyFile = Path.Combine(
|
||||
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
|
||||
"Microsoft.Xaml.Behaviors.dll"
|
||||
);
|
||||
return File.Exists(assemblyFile) ? Assembly.LoadFrom(assemblyFile) : null;
|
||||
}
|
||||
private static Dictionary<Type, Window> _windows = [];
|
||||
public static void ShowOrActivate<TWindow, TViewModel>(params object[] viewModelParams)
|
||||
where TWindow : Window, new()
|
||||
|
||||
Reference in New Issue
Block a user