AutoInit.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using JLHHJSvr.Com.Model;
  2. using JLHHJSvr.LJException;
  3. using System;
  4. using System.Collections.Concurrent;
  5. using System.Collections.Generic;
  6. using System.Data.SqlClient;
  7. using System.Data.SqlTypes;
  8. using System.Diagnostics;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Web.UI.WebControls;
  12. namespace JLHHJSvr.Tools
  13. {
  14. public class AutoInit
  15. {
  16. private static readonly ConcurrentDictionary<string, CacheItem> ColumnInfoCache = new ConcurrentDictionary<string, CacheItem>();
  17. private static readonly TimeSpan CacheExpirationTime = TimeSpan.FromMinutes(60); // 缓存过期时间1小时
  18. public static void AutoInitS <T>(SqlCommand cmd, T instance){
  19. var tableName = instance.GetType().Name;
  20. var currentTime = DateTime.Now;
  21. if (ColumnInfoCache.TryGetValue(tableName, out var cache) && currentTime - cache.CacheTime < CacheExpirationTime)
  22. {
  23. // 缓存有效,使用缓存
  24. foreach (var item in cache.ColumnInfo)
  25. {
  26. var column = item.Value.Column;
  27. var isNullable = item.Value.IsNullable;
  28. var property = instance.GetType().GetProperties().FirstOrDefault(prop => prop.Name.Equals(column, StringComparison.OrdinalIgnoreCase));
  29. if (property == null) continue;
  30. if (isNullable.Equals("NO") && property.GetValue(instance) == null)
  31. {
  32. var type = property.PropertyType;
  33. if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
  34. {
  35. type = type.GetGenericArguments()[0];
  36. }
  37. if (type.IsAssignableFrom(typeof(string)))
  38. {
  39. property.SetValue(instance, "");
  40. }
  41. else if (type.IsAssignableFrom(typeof(int))
  42. || type.IsAssignableFrom(typeof(decimal))
  43. || type.IsAssignableFrom(typeof(byte)))
  44. {
  45. property.SetValue(instance, Activator.CreateInstance(type));
  46. }
  47. }
  48. }
  49. } else
  50. {
  51. // 缓存过期,重新加载列信息
  52. var columnInfo = new Dictionary<string, ColumnItem>();
  53. cmd.CommandText = @"SELECT COLUMN_NAME, IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName";
  54. cmd.Parameters.Clear();
  55. cmd.Parameters.AddWithValue("@tableName", instance.GetType().Name);
  56. using (var reader = cmd.ExecuteReader())
  57. {
  58. while (reader.Read())
  59. {
  60. var column = Convert.ToString(reader["COLUMN_NAME"]).Trim();
  61. var isNullable = Convert.ToString(reader["IS_NULLABLE"]).Trim();
  62. columnInfo[column] = new ColumnItem(column, isNullable);
  63. }
  64. }
  65. ColumnInfoCache[tableName] = new CacheItem { CacheTime = currentTime, ColumnInfo = columnInfo };
  66. // 使用新的列信息初始化属性
  67. foreach (var item in columnInfo)
  68. {
  69. var column = item.Value.Column;
  70. var isNullable = item.Value.IsNullable;
  71. var property = instance.GetType().GetProperties().FirstOrDefault(prop => prop.Name.Equals(column, StringComparison.OrdinalIgnoreCase));
  72. if (property == null) continue;
  73. if (isNullable.Equals("NO") && property.GetValue(instance) == null)
  74. {
  75. var type = property.PropertyType;
  76. if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
  77. {
  78. type = type.GetGenericArguments()[0];
  79. }
  80. if (type.IsAssignableFrom(typeof(string)))
  81. {
  82. property.SetValue(instance, "");
  83. }
  84. else if (type.IsAssignableFrom(typeof(int))
  85. || type.IsAssignableFrom(typeof(decimal))
  86. || type.IsAssignableFrom(typeof(byte)))
  87. {
  88. property.SetValue(instance, Activator.CreateInstance(type));
  89. }
  90. }
  91. }
  92. }
  93. }
  94. public static void AutoInitS<T>(T instance)
  95. {
  96. foreach (var TB in instance.GetType().GetProperties())
  97. {
  98. var type = TB.PropertyType;
  99. var value = TB.GetValue(instance, null);
  100. if (value == null)
  101. {
  102. if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
  103. {
  104. type = type.GetGenericArguments()[0];
  105. }
  106. if (type.IsAssignableFrom(typeof(string)))
  107. {
  108. value = string.Empty;
  109. }
  110. else if (type.IsAssignableFrom(typeof(int))
  111. || type.IsAssignableFrom(typeof(decimal))
  112. || type.IsAssignableFrom(typeof(byte)))
  113. {
  114. value = Activator.CreateInstance(type);
  115. }
  116. if (value != null)
  117. {
  118. TB.SetValue(instance, value, null);
  119. }
  120. }
  121. }
  122. }
  123. }
  124. }