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; } } }