Эх сурвалжийг харах

优化代码可读性并添加获取属性类型的新方法

调整了 `foreach` 循环中 lambda 表达式的空格,提高代码可读性。在 `InitTypeBuilder` 方法中,替换了直接获取属性类型的代码,改为调用新的 `GetPropertyType` 方法。新增的私有静态方法 `GetPropertyType` 通过递归处理嵌套属性,返回相应的属性类型,找不到时返回 `string` 类型。
xf 1 сар өмнө
parent
commit
344b046cd4

+ 20 - 2
src/Hotline/Tools/DynamicClassHelper.cs

@@ -17,7 +17,7 @@ public class DynamicClassHelper
         ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");
         TypeBuilder typeBuilder = moduleBuilder.DefineType(className, TypeAttributes.Public);
 
-        foreach (var property in propInfos.OrderBy(d=>d.Sort).ToList())
+        foreach (var property in propInfos.OrderBy(d => d.Sort).ToList())
         {
             var propertyName = property.Prop.Trim().ToPascalCase();
             var propertyType = typeof(string);
@@ -87,7 +87,8 @@ public class DynamicClassHelper
         foreach (var property in propInfos.OrderBy(d => d.Sort).ToList())
         {
             var propertyName = property.Prop.Trim().ToPascalCase();
-            var propertyType = sourceProps.FirstOrDefault(d => d.Name == propertyName)?.PropertyType ?? typeof(string);
+            //var propertyType = sourceProps.FirstOrDefault(d => d.Name == propertyName)?.PropertyType ?? typeof(string);
+            var propertyType = GetPropertyType(property.Prop, sourceProps);
 
             FieldBuilder fieldBuilder = typeBuilder.DefineField("_" + propertyName, propertyType, FieldAttributes.Private);
             PropertyBuilder propertyBuilder = typeBuilder.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);
@@ -123,4 +124,21 @@ public class DynamicClassHelper
         }
     }
 
+    private static Type GetPropertyType(string propName, PropertyInfo[] sourceProps)
+    {
+        var propNameArray = propName.Split('.', StringSplitOptions.TrimEntries)
+            .Select(d => d.ToPascalCase())
+            .ToList();
+        if (propNameArray.Count == 1)
+        {
+            return sourceProps.FirstOrDefault(d => d.Name == propNameArray[0])?.PropertyType ?? typeof(string);
+        }
+        else
+        {
+            var prop = sourceProps.FirstOrDefault(d => d.Name == propNameArray[0]);
+            if (prop == null)
+                return typeof(string);
+            return GetPropertyType(string.Join(".", propNameArray.Skip(1)), prop.PropertyType.GetProperties());
+        }
+    }
 }