初始化提交
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace JinYuan.Models.HelperAttribute
|
||||
{
|
||||
public static class AnnotationUtils
|
||||
{
|
||||
public static List<PropertyInfo> GetPropertiesWithAnnotation<T>(Type type) where T : Attribute
|
||||
{
|
||||
var properties = type.GetProperties().Where(p => p.GetCustomAttributes(typeof(T), true).Length > 0).ToList();
|
||||
return properties;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前类的DataGridViewColumn
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
/// <returns></returns>
|
||||
public static List<DataGridViewColumn> GetDataGridViewColumns(this object obj)
|
||||
{
|
||||
Type typeObj = obj.GetType();
|
||||
var properties = AnnotationUtils.GetPropertiesWithAnnotation<DataGridViewColumn>(typeObj);
|
||||
|
||||
List<DataGridViewColumn> list = new List<DataGridViewColumn>();
|
||||
foreach (var property in properties)
|
||||
{
|
||||
DataGridViewColumn attribute = property.GetCustomAttribute<DataGridViewColumn>();
|
||||
//数据源名称
|
||||
attribute.DataPropertyName = property.Name;
|
||||
list.Add(attribute);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace JinYuan.Models.HelperAttribute
|
||||
{
|
||||
/// <summary>
|
||||
/// 数据表格列映射特性(支持字段/属性)
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
|
||||
public sealed class DataGridColumnAttribute : Attribute
|
||||
{
|
||||
/// <summary>
|
||||
/// 目标列名(默认使用成员名)
|
||||
/// </summary>
|
||||
public string ColumnName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 列数据类型(默认使用成员类型)
|
||||
/// </summary>
|
||||
public Type ColumnType { get; set; }
|
||||
|
||||
public DataGridColumnAttribute() { }
|
||||
|
||||
public DataGridColumnAttribute(string columnName) => ColumnName = columnName;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace JinYuan.Models.HelperAttribute
|
||||
{
|
||||
public class DataGridViewColumn : Attribute
|
||||
{
|
||||
public string HeaderText { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string DataPropertyName { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
using JinYuan.Models.HelperAttribute;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Reflection;
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// DataTable 映射工具
|
||||
/// </summary>
|
||||
/// <summary>
|
||||
/// DataTable 映射工具
|
||||
/// </summary>
|
||||
public static class DataTableMapper
|
||||
{
|
||||
/// <summary>
|
||||
/// 实体类型转换为 DataTable 结构(含注解解析)
|
||||
/// </summary>
|
||||
public static DataTable ToSchema(Type type)
|
||||
{
|
||||
var dt = new DataTable(type.Name);
|
||||
var members = type.GetMembers(BindingFlags.Public | BindingFlags.Instance);
|
||||
|
||||
foreach (var member in members)
|
||||
{
|
||||
var prop = member as PropertyInfo;
|
||||
var field = member as FieldInfo;
|
||||
if ((prop != null && !prop.CanRead) || (field == null && prop == null)) continue;
|
||||
|
||||
var attr = member.GetCustomAttribute<DataGridColumnAttribute>();
|
||||
var colName = attr != null ? attr.ColumnName : member.Name;
|
||||
var colType = attr != null && attr.ColumnType != null ? attr.ColumnType :
|
||||
(prop != null ? prop.PropertyType : field.FieldType);
|
||||
|
||||
var column = dt.Columns.Add(colName, colType);
|
||||
column.AllowDBNull = !(colType.GetTypeInfo().IsValueType &&
|
||||
!colType.GetTypeInfo().IsGenericType);
|
||||
}
|
||||
return dt;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 实体集合转换为 DataTable(含注解映射)
|
||||
/// 使用: var dt = DataTableMapper.ToDataTable (employees, typeof (Employee));
|
||||
/// </summary>
|
||||
public static DataTable ToDataTable(this IEnumerable<object> entities, Type type)
|
||||
{
|
||||
var dt = ToSchema(type);
|
||||
if (entities == null) return dt;
|
||||
|
||||
foreach (var entity in entities)
|
||||
{
|
||||
var row = dt.NewRow();
|
||||
FillDataRow(entity, row, type);
|
||||
dt.Rows.Add(row);
|
||||
}
|
||||
return dt;
|
||||
}
|
||||
|
||||
private static void FillDataRow(object entity, DataRow row, Type type)
|
||||
{
|
||||
foreach (DataColumn column in row.Table.Columns)
|
||||
{
|
||||
MemberInfo member = null;
|
||||
foreach (var m in type.GetMembers(BindingFlags.Public | BindingFlags.Instance))
|
||||
{
|
||||
var attr = m.GetCustomAttribute<DataGridColumnAttribute>();
|
||||
var mName = attr != null ? attr.ColumnName : m.Name;
|
||||
if (string.Equals(mName, column.ColumnName, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
member = m;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (member == null) continue;
|
||||
|
||||
object value;
|
||||
if (member is PropertyInfo prop)
|
||||
{
|
||||
value = prop.GetValue(entity);
|
||||
}
|
||||
else if (member is FieldInfo field)
|
||||
{
|
||||
value = field.GetValue(entity);
|
||||
}
|
||||
else
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
row[column] = value ?? DBNull.Value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// DataTable 转换为 List<T>
|
||||
/// 使用案例: var employeeList = dt.ToList<Employee>();
|
||||
/// </summary>
|
||||
public static List<T> ToList<T>(this DataTable dt) where T : new()
|
||||
{
|
||||
var list = new List<T>();
|
||||
var type = typeof(T);
|
||||
var members = type.GetMembers(BindingFlags.Public | BindingFlags.Instance);
|
||||
|
||||
foreach (DataRow row in dt.Rows)
|
||||
{
|
||||
var item = new T();
|
||||
foreach (var member in members)
|
||||
{
|
||||
var prop = member as PropertyInfo;
|
||||
var field = member as FieldInfo;
|
||||
if ((prop != null && !prop.CanWrite) || (field == null && prop == null)) continue;
|
||||
|
||||
var attr = member.GetCustomAttribute<DataGridColumnAttribute>();
|
||||
var colName = attr != null ? attr.ColumnName : member.Name;
|
||||
if (dt.Columns.Contains(colName))
|
||||
{
|
||||
var value = row[colName];
|
||||
if (value != DBNull.Value)
|
||||
{
|
||||
if (prop != null)
|
||||
{
|
||||
prop.SetValue(item, Convert.ChangeType(value, prop.PropertyType));
|
||||
}
|
||||
else if (field != null)
|
||||
{
|
||||
field.SetValue(item, Convert.ChangeType(value, field.FieldType));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
list.Add(item);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 循环获取当前 DataTable 的列名称,通过自定义的获取名称方法获取新的列名并替换
|
||||
/// </summary>
|
||||
/// <param name="dt">要处理的 DataTable</param>
|
||||
/// <param name="getNewColumnName">自定义的获取新列名的方法</param>
|
||||
/// <returns>列名替换后的 DataTable</returns>
|
||||
public static DataTable ReplaceColumnNamesWithCustomMethod(this DataTable dt, Func<string, string> GetNewColumnName)
|
||||
{
|
||||
for (int i = 0; i < dt.Columns.Count; i++)
|
||||
{
|
||||
string originalColumnName = dt.Columns[i].ColumnName;
|
||||
string newColumnName = GetNewColumnName(originalColumnName);
|
||||
dt.Columns[i].ColumnName = newColumnName;
|
||||
}
|
||||
return dt;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user