From 1a1c8e71fcd14858f595029f089b2d4a00202b32 Mon Sep 17 00:00:00 2001
From: ogi <Administrator@S-OGI-PC>
Date: Fri, 05 Dec 2025 09:24:16 +0900
Subject: [PATCH] プロジェクトファイルを追加。
---
ProtosExpan/GrpcTable.cs | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 210 insertions(+), 0 deletions(-)
diff --git a/ProtosExpan/GrpcTable.cs b/ProtosExpan/GrpcTable.cs
new file mode 100644
index 0000000..4b76a0c
--- /dev/null
+++ b/ProtosExpan/GrpcTable.cs
@@ -0,0 +1,210 @@
+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;
+ }
+ }
+}
--
Gitblit v1.10.0