using HotelPms.Share.Data;
using HotelPms.Share.Util;
using System.Data;
using System.Reflection;
namespace HotelPms.Data
{
///
/// GrpcTableの拡張
///
public partial class GrpcTable
{
///
/// 汎用クラスへバラス
///
///
///
public List Convert() where T : new()
{
List nameList = new List();
List typeList = new List();
foreach (GrpcCol col in Cols)
{
Type type = CConvert.ToType(col.FieldType);
typeList.Add(type);
nameList.Add(col.Name);
}
List list = new List();
//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(row, typeList, nameList);
list.Add(item);
}
}
return list;
}
///
/// 一行目、一列目を返す
///
///
///
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(GrpcRow row, List typeList, List 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;
}
///
/// 値を返す
///
///
///
///
///
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 list = new List();
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;
}
///
///
///
///
public DataTable ToDataTable()
{
Console.WriteLine($"ToDataTable⇒Begin:{DateTime.Now.ToString("HH:mm:ss fff")}");
DataTable dataTable = new DataTable();
dataTable.TableName = Name;
List typeList = new List();
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;
}
}
}