using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Reflection;
namespace ExtraLib.Extends
{
public static class ConvertionExtensions
{
public static T ConvertTo<T>(IConvertible convertibleValue)
{
if (null == convertibleValue)
{
return default(T);
}
if (!typeof(T).IsGenericType)
{
return (T)Convert.ChangeType(convertibleValue, typeof(T));
}
var genericTypeDefinition = typeof(T).GetGenericTypeDefinition();
if (genericTypeDefinition == typeof(Nullable<>))
{
return (T)Convert.ChangeType(convertibleValue, Nullable.GetUnderlyingType(typeof(T)));
}
throw new InvalidCastException(string.Format("Invalid cast from type \"{0}\" to type \"{1}\".", convertibleValue.GetType().FullName, typeof(T).FullName));
}
}
public static class ModelMapping<T> where T : new()
{
/// <summary>
/// 获取属性的显示名称
/// </summary>
/// <param name="property"></param>
/// <returns></returns>
public static string GetDisplayName(PropertyInfo property)
{
var attribute = property.GetCustomAttributes(typeof(DisplayNameAttribute), false)[0];
return ((DisplayNameAttribute)attribute)?.DisplayName;
}
/// <summary>
/// 获取指定名称属性
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static PropertyInfo GetPropertyByName(string name)
{
var type = typeof(T);
return type.GetProperty(name);
}
/// <summary>
/// 根据显示名称获取属性
/// </summary>
/// <param name="displayName"></param>
/// <returns></returns>
public static PropertyInfo GetPropertyByDisplayName(string displayName)
{
foreach (var property in GetProperties())
{
if (GetDisplayName(property) == displayName)
{
return property;
}
}
return null;
}
/// <summary>
/// 获取所有属性
/// </summary>
/// <returns></returns>
public static PropertyInfo[] GetProperties()
{
return typeof(T).GetProperties();
}
/// <summary>
/// 获取所有属性名称
/// </summary>
/// <returns></returns>
public static string[] GetNames()
{
var list = new List<string>();
foreach (var property in GetProperties())
{
var name = property.Name;
list.Add(name);
}
return list.ToArray();
}
/// <summary>
/// 获取所有显示名称
/// </summary>
/// <returns></returns>
public static string[] GetDisplayNames()
{
var list = new List<string>();
foreach (var property in GetProperties())
{
var displayName = GetDisplayName(property);
list.Add(displayName);
}
return list.ToArray();
}
/// <summary>
/// 获取属性值
/// </summary>
/// <param name="entity"></param>
/// <param name="nameOrDisplayName"></param>
/// <param name="isDisplayName"></param>
/// <returns></returns>
public static object GetValue(T entity, string nameOrDisplayName, bool isDisplayName = false)
{
var property = isDisplayName
? GetPropertyByDisplayName(nameOrDisplayName)
: GetPropertyByName(nameOrDisplayName);
return property?.GetValue(entity, null);
}
/// <summary>
/// 设定属性值
/// </summary>
/// <param name="entity"></param>
/// <param name="nameOrDisplayName"></param>
/// <param name="value"></param>
/// <param name="isDisplayName"></param>
public static void SetValue(T entity, string nameOrDisplayName, object value, bool isDisplayName = false)
{
var property = isDisplayName
? GetPropertyByDisplayName(nameOrDisplayName)
: GetPropertyByName(nameOrDisplayName);
try
{
var convertValue = Convert.ChangeType(value, property.PropertyType);
property?.SetValue(entity, convertValue, null);
}
catch
{
// ignored
}
}
/// <summary>
/// 获得映射数据表
/// </summary>
/// <param name="useDisplayName"></param>
/// <returns></returns>
public static DataTable GetTable(bool useDisplayName = false)
{
var dt = new DataTable(typeof(T).Name);
var names = useDisplayName ? GetDisplayNames() : GetNames();
foreach (var name in names)
{
dt.Columns.Add(name);
}
return dt;
}
/// <summary>
/// 获得映射数据行
/// </summary>
/// <param name="entity"></param>
/// <param name="dt"></param>
/// <param name="useDisplayName"></param>
/// <returns></returns>
public static DataRow GetRow(T entity, DataTable dt, bool useDisplayName = false)
{
var dr = dt.NewRow();
var names = useDisplayName ? GetDisplayNames() : GetNames();
foreach (var name in names)
{
dr[name] = GetValue(entity, name, useDisplayName);
}
return dr;
}
/// <summary>
/// 将数据行映射为实例(未给定列名)
/// </summary>
/// <param name="dr"></param>
/// <param name="useDisplayName"></param>
/// <returns></returns>
public static T MapToEntity(DataRow dr, bool useDisplayName = false)
{
var entity = new T();
var names = useDisplayName ? GetDisplayNames() : GetNames();
foreach (var name in names)
{
SetValue(entity, name, dr[name], useDisplayName);
}
return entity;
}
/// <summary>
/// 将数据行映射为实例(已给定列名)
/// </summary>
/// <param name="dr"></param>
/// <param name="names"></param>
/// <param name="useDisplayName"></param>
/// <returns></returns>
public static T MapToEntity(DataRow dr, string[] names, bool useDisplayName = false)
{
var entity = new T();
foreach (var name in names)
{
SetValue(entity, name, dr[name], useDisplayName);
}
return entity;
}
/// <summary>
/// 将数据表映射为模型列表
/// </summary>
/// <param name="dt"></param>
/// <param name="useDisplayName"></param>
/// <returns></returns>
public static List<T> MapToList(DataTable dt, bool useDisplayName = false)
{
var list = new List<T>();
var names = useDisplayName ? GetDisplayNames() : GetNames();
foreach (DataRow dr in dt.Rows)
{
var entity = MapToEntity(dr, names, useDisplayName);
list.Add(entity);
}
return list;
}
/// <summary>
/// 将模型列表映射为数据表(新建表)
/// </summary>
/// <param name="list"></param>
/// <param name="useDisplayName"></param>
/// <returns></returns>
public static DataTable MapToTable(List<T> list, bool useDisplayName = false)
{
var dt = GetTable(useDisplayName);
foreach (var entity in list)
{
var dr = GetRow(entity, dt, useDisplayName);
dt.Rows.Add(dr);
}
return dt;
}
/// <summary>
/// 将模型列表映射为数据表(已有表)
/// </summary>
/// <param name="dt"></param>
/// <param name="list"></param>
/// <param name="useDisplayName"></param>
public static void MapToTable(DataTable dt, List<T> list, bool useDisplayName = false)
{
dt.Rows.Clear();
foreach (var entity in list)
{
var dr = GetRow(entity, dt, useDisplayName);
dt.Rows.Add(dr);
}
}
}
}
ModelMapping.cs
最新推荐文章于 2023-01-16 16:48:18 发布