You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

348 lines
12 KiB

1 year ago
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Windows.Forms;
namespace CK.SCP.Utils
{
public static class ListHelper
{
public static T JsonToEntity<T>(string jsonString)
{
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
{
var serializer = new DataContractJsonSerializer(typeof(T));
return (T)serializer.ReadObject(ms);
}
}
public static string Entity2Json<T>(T model) where T : class
{
using (var ms = new MemoryStream())
{
var serializer = new DataContractJsonSerializer(typeof(T));
serializer.WriteObject(ms, model);
ms.Position = 0;
StreamReader sr = new StreamReader(ms, Encoding.UTF8);
string json = sr.ReadToEnd();
sr.Close();
ms.Close();
return json;
}
}
public static List<T> JsonToList<T>(string jsonString)
{
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
{
var serializer = new DataContractJsonSerializer(typeof(T));
return (List<T>)serializer.ReadObject(ms);
}
}
public static IList<T> SearchList<T>(IEnumerable<T> tList, string txt)
{
IList<T> selectedList = new List<T>();
foreach (var t in tList)
{
var a = typeof(T);
var ps = a.GetProperties();
foreach (PropertyInfo info in ps)
{
object o = info.GetValue(t);
if (o != null && o.ToString().Contains(txt))
{
selectedList.Add(t);
break;
}
}
}
return selectedList;
}
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys = new HashSet<TKey>();
return source.Where(element => seenKeys.Add(keySelector(element)));
}
public static T DataTableToEntity<T>(DataTable dt) where T : new()
{
var t = new T();
var tList = DataTableToList<T>(dt);
if (tList.Count > 0)
t = tList[0];
return t;
}
public static List<T> DataTableToList<T>(DataTable dt) where T : new()
{
List<T> tList = new List<T>();
try
{
foreach (DataRow dr in dt.Rows)
{
var t = new T();
var propertys = t.GetType().GetProperties();
foreach (var pi in propertys)
{
object value = null;
var piName = pi.Name;
if (dt.Columns.Contains(piName))
{
value = ConvertToType(dr[piName], pi.PropertyType);
}
if (!pi.CanWrite) continue;
try
{
pi.SetValue(t, value, null);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
throw;
}
}
tList.Add(t);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return tList;
}
public static DataTable EntityToDataTable<T>(T t) where T : new()
{
if(t==null) return new DataTable();
var tList = new List<T> { t };
var dt = ListToDataTable(tList, t.GetType().Name);
return dt;
}
public static DataSet EntityToDataSet<T>(T t) where T : new()
{
if (t == null) return new DataSet();
var tList = new List<T> { t };
var dt = ListToDataTable(tList, t.GetType().Name);
var ds = new DataSet();
ds.Tables.Add(dt);
return ds;
}
public static DataSet ListToDataSet<T>(List<T> tList) where T : new()
{
var t = new T();
var dt = ListToDataTable(tList, t.GetType().Name);
var ds = new DataSet();
ds.Tables.Add(dt);
return ds;
}
public static DataTable ListToDataTable<T>(List<T> tList) where T : new()
{
if (tList == null||tList.Count==0) return new DataTable();
var t = new T();
var dt = ListToDataTable(tList, t.GetType().Name);
return dt;
}
public static DataTable ListToDataTable<T>(List<T> tList, string tableName) where T : new()
{
var dt = new DataTable { TableName = tableName };
if (tList == null || tList.Count == 0) return new DataTable();
var t = new T();
var properties = t.GetType().GetProperties();
foreach (var pi in properties)
{
// The the type of the property
Type columnType = pi.PropertyType;
// We need to check whether the property is NULLABLE
if (pi.PropertyType.IsGenericType &&
pi.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
// If it is NULLABLE, then get the underlying type. eg if "Nullable<int>" then this will return just "int"
columnType = pi.PropertyType.GetGenericArguments()[0];
}
// Add the column definition to the datatable.
dt.Columns.Add(new DataColumn(pi.Name, columnType));
// dc = new DataColumn(columnName,pi.PropertyType);
// dt.Columns.Add(dc);
}
foreach (var tt in tList)
{
var dr = dt.NewRow();
foreach (var pi in properties)
{
var columnName = pi.Name;
try
{
var value = pi.GetValue(tt, null);
dr[columnName] = value ?? DBNull.Value;
}
catch (Exception)
{
dr[columnName] = DBNull.Value;
}
// dr[columnName] = pi.GetValue(tt, new object[] {null}) ?? DBNull.Value;
if (pi.PropertyType.FullName == "System.Decimal")
{
dr[columnName] = Math.Round(Convert.ToDecimal(dr[columnName]), 2);
}
}
dt.Rows.Add(dr);
}
return dt;
}
public static object ConvertToType(object value, Type convertsionType)
{
object returnValue = "";
try
{
if (convertsionType.IsGenericType && convertsionType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
if (value != null && value != DBNull.Value && value.ToString() != "" && value.ToString().Length > 0)
{
var nullableConverter = new NullableConverter(convertsionType);
convertsionType = nullableConverter.UnderlyingType;
returnValue = Convert.ChangeType(value, convertsionType);
}
else
{
returnValue = null;
}
}
else
{
if (value != null && value != DBNull.Value && value.ToString() != "" && value.ToString().Length > 0)
{
if (value.ToString().IndexOf("%", System.StringComparison.Ordinal) == value.ToString().Length - 1)
{
switch (convertsionType.ToString())
{
case "System.Decimal":
returnValue = Convert.ToDecimal(value.ToString().Replace("%", "")) / 100;
break;
case "System.Double":
returnValue = Convert.ToDecimal(value.ToString().Replace("%", "")) / 100;
break;
case "System.Single":
returnValue = Convert.ToDecimal(value.ToString().Replace("%", "")) / 100;
break;
}
}
else if (value.ToString() == "-")
{
returnValue = 0;
}
else
{
returnValue = Convert.ChangeType(value, convertsionType);
if (convertsionType.FullName == "System.Decimal")
returnValue = Math.Round((decimal)returnValue, 5);
if (convertsionType.FullName == "System.String")
returnValue = returnValue.ToString().TrimEnd();
}
}
else
{
returnValue = GetReturnValue(convertsionType);
}
}
}
catch
{
returnValue = GetReturnValue(convertsionType);
}
return returnValue;
}
private static object GetReturnValue(Type convertsionType)
{
object returnValue;
switch (convertsionType.ToString())
{
case "System.Guid":
returnValue = Guid.NewGuid();
break;
case "System.DateTime":
returnValue = DateTime.Now;
break;
case "System.Decimal":
returnValue = 0m;
break;
case "System.Double":
returnValue = 0.0;
break;
case " System.UInt16":
returnValue = 0;
break;
case " System.UInt32":
returnValue = 0;
break;
case " System.UInt64":
returnValue = 0;
break;
case "System.Int32":
returnValue = 0;
break;
case "System.Int16":
returnValue = 0;
break;
case "System.Int64":
returnValue = 0;
break;
case "System.String":
returnValue = "";
break;
case "System.Single":
returnValue = 0.0f;
break;
default:
returnValue = "";
break;
}
return returnValue;
}
}
}