using HotelPms.Share.Data;
|
using HotelPms.Share.Util;
|
using System.Data;
|
using System.Reflection;
|
|
namespace HotelPms.Data
|
{
|
/// <summary>
|
/// GrpcTableの拡張
|
/// </summary>
|
public partial class GrpcTable
|
{
|
/// <summary>
|
/// 汎用クラスへバラス
|
/// </summary>
|
/// <typeparam name="T"></typeparam>
|
/// <returns></returns>
|
public List<T> Convert<T>() where T : new()
|
{
|
List<string> nameList = new List<string>();
|
List<Type> typeList = new List<Type>();
|
foreach (GrpcCol col in Cols)
|
{
|
Type type = CConvert.ToType(col.FieldType);
|
typeList.Add(type);
|
nameList.Add(col.Name);
|
}
|
|
List<T> list = new List<T>();
|
|
//TはRecordBaseの子供クラス
|
if (typeof(T).IsSubclassOf(typeof(RecordBase)))
|
{
|
foreach (GrpcRow row in this.Rows)
|
{
|
T item = new T();
|
int p = 0;
|
for (int i = 0; i < typeList.Count; i++)
|
{
|
Type type = typeList[i];
|
object val = GetFieldValue(type, row, ref p);
|
(item as RecordBase).SetField(nameList[i], val);
|
}
|
list.Add(item);
|
}
|
}
|
else
|
{
|
foreach (GrpcRow row in this.Rows)
|
{
|
T item = GetItem<T>(row, typeList, nameList);
|
list.Add(item);
|
}
|
}
|
return list;
|
}
|
|
/// <summary>
|
/// 一行目、一列目を返す
|
/// </summary>
|
/// <param name="type"></param>
|
/// <returns></returns>
|
public object? GetValue(Type type)
|
{
|
try
|
{
|
if (Rows.Count == 0) { return null; }
|
int p = 0;
|
return GetFieldValue(type, Rows[0], ref p);
|
}
|
catch
|
{
|
return null;
|
}
|
}
|
|
private T GetItem<T>(GrpcRow row, List<Type> typeList, List<string> nameList) where T : new()
|
{
|
Type temp = typeof(T);
|
T obj = new T();
|
|
int p = 0;
|
for (int i = 0; i < typeList.Count; i++)
|
{
|
Type type = typeList[i];
|
object val = GetFieldValue(type, row, ref p);
|
|
//↓効率悪い
|
foreach (PropertyInfo pro in temp.GetProperties())
|
{
|
if (pro.Name.ToUpper() == nameList[i].ToUpper())
|
{
|
pro.SetValue(obj, val, null);
|
break;
|
}
|
else
|
{
|
continue;
|
}
|
}
|
}
|
|
return obj;
|
}
|
|
/// <summary>
|
/// 値を返す
|
/// </summary>
|
/// <param name="type"></param>
|
/// <param name="row"></param>
|
/// <param name="p"></param>
|
/// <returns></returns>
|
private object GetFieldValue(Type type, GrpcRow row, ref int p)
|
{
|
object ret = null;
|
if (type == typeof(System.Int32))
|
{
|
ret = BitConverter.ToInt32(row.Data.Span.Slice(p, 4).ToArray());
|
p += 4;
|
}
|
else if (type == typeof(bool))
|
{
|
ret = BitConverter.ToBoolean(row.Data.Span.Slice(p, 1).ToArray());
|
p += 1;
|
}
|
else if (type == typeof(DateTime))
|
{
|
DateTime dateTime = CConvert.ToDateTimeFromBytes(row.Data.Span.Slice(p, 8).ToArray());
|
ret = (dateTime.CompareTo(DateTime.MinValue) == 0) ? DBNull.Value : dateTime;
|
p += 8;
|
}
|
else if (type == typeof(float))
|
{
|
ret = BitConverter.ToSingle(row.Data.Span.Slice(p, 4).ToArray());
|
p += 4;
|
}
|
else if (type == typeof(double))
|
{
|
ret = BitConverter.ToDouble(row.Data.Span.Slice(p, 8).ToArray());
|
p += 8;
|
}
|
else if (type == typeof(decimal))
|
{
|
ret = CConvert.ToDecimal(row.Data.Span.Slice(p, 16).ToArray());
|
p += 16;
|
}
|
else if (type == typeof(System.Byte))
|
{
|
ret = row.Data.Span[p];
|
p += 1;
|
}
|
else if (type == typeof(System.Int16))
|
{
|
ret = BitConverter.ToInt16(row.Data.Span.Slice(p, 2).ToArray());
|
p += 2;
|
}
|
else
|
{
|
//0x00まで
|
List<byte> list = new List<byte>();
|
while (true)
|
{
|
byte val = row.Data.Span[p];
|
if (val == 0x00) { p++; break; }
|
list.Add(val);
|
p++;
|
}
|
ret = System.Text.Encoding.UTF8.GetString(list.ToArray());
|
}
|
|
return ret;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <returns></returns>
|
public DataTable ToDataTable()
|
{
|
Console.WriteLine($"ToDataTable⇒Begin:{DateTime.Now.ToString("HH:mm:ss fff")}");
|
DataTable dataTable = new DataTable();
|
dataTable.TableName = Name;
|
List<Type> typeList = new List<Type>();
|
foreach (GrpcCol col in Cols)
|
{
|
Type type = CConvert.ToType(col.FieldType);
|
typeList.Add(type);
|
dataTable.Columns.Add(col.Name, type);
|
}
|
|
//データ
|
foreach (GrpcRow row in Rows)
|
{
|
DataRow dtRow = dataTable.NewRow();
|
dataTable.Rows.Add(dtRow);
|
|
object[] rowArray = new object[typeList.Count];
|
int p = 0;
|
for (int i = 0; i < typeList.Count; i++)
|
{
|
Type type = typeList[i];
|
rowArray[i] = GetFieldValue(type, row, ref p);
|
}
|
dtRow.ItemArray = rowArray;
|
}
|
Console.WriteLine($"ToDataTable⇒End:{DateTime.Now.ToString("HH:mm:ss fff")}");
|
return dataTable;
|
}
|
}
|
}
|