1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
   | using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Text;
  public static class IniSerializer {          public static void Serialize<T>(T obj, string filePath)     {         var type = typeof(T);         var sectionAttr = type.GetCustomAttribute<IniSectionAttribute>();         string section = sectionAttr?.SectionName ?? type.Name;
          var sb = new StringBuilder();
          foreach (var field in type.GetFields(BindingFlags.Public | BindingFlags.Instance))         {             ProcessMember(sb, section, field, field.GetValue(obj));         }
          foreach (var prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance))         {             ProcessMember(sb, section, prop, prop.GetValue(obj));         }
          File.WriteAllText(filePath, sb.ToString());     }
           public static T Deserialize<T>(string filePath) where T : new()     {         var obj = new T();         var type = typeof(T);         var sectionAttr = type.GetCustomAttribute<IniSectionAttribute>();         string section = sectionAttr?.SectionName ?? type.Name;
          var lines = File.ReadAllLines(filePath);         var data = new Dictionary<string, string>();
          foreach (var line in lines)         {             if (line.StartsWith("[") && line.EndsWith("]"))             {                              }             else if (line.Contains("="))             {                 var parts = line.Split(new[] { '=' }, 2);                 data[parts[0].Trim()] = parts[1].Trim();             }         }
          foreach (var field in type.GetFields(BindingFlags.Public | BindingFlags.Instance))         {             SetMemberValue(obj, field, data);         }
          foreach (var prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance))         {             SetMemberValue(obj, prop, data);         }
          return obj;     }
      private static void ProcessMember(StringBuilder sb, string section, MemberInfo member, object value)     {         var keyAttr = member.GetCustomAttribute<IniKeyAttribute>();         string keyName = keyAttr?.KeyName ?? member.Name;
          if (value != null)         {             sb.AppendLine($"{keyName}={ConvertToString(value)}");         }     }
      private static void SetMemberValue<T>(T obj, MemberInfo member, Dictionary<string, string> data)     {         var keyAttr = member.GetCustomAttribute<IniKeyAttribute>();         string keyName = keyAttr?.KeyName ?? member.Name;
          if (data.TryGetValue(keyName, out string strValue))         {             object value = ConvertFromString(strValue, GetMemberType(member));                          if (member is FieldInfo field)                 field.SetValue(obj, value);             else if (member is PropertyInfo prop && prop.CanWrite)                 prop.SetValue(obj, value);         }     }
      private static Type GetMemberType(MemberInfo member)     {         return member.MemberType switch         {             MemberTypes.Field => ((FieldInfo)member).FieldType,             MemberTypes.Property => ((PropertyInfo)member).PropertyType,             _ => throw new NotSupportedException()         };     }
           private static string ConvertToString(object value)     {         return value switch         {             DateTime dt => dt.ToString("yyyy-MM-dd HH:mm:ss"),             Enum e => e.ToString(),             _ => value.ToString()         };     }
      private static object ConvertFromString(string value, Type targetType)     {         if (targetType == typeof(string))             return value;
          if (targetType.IsEnum)             return Enum.Parse(targetType, value);
          return Convert.ChangeType(value, targetType);     } }
   |