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