代码拉取完成,页面将自动刷新
同步操作将从 黑龙/Zircon 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
namespace Library
{
public static class ConfigReader
{
private static readonly Regex HeaderRegex = new Regex(@"^\[(?<Header>.+)\]$", RegexOptions.Compiled);
private static readonly Regex EntryRegex = new Regex(@"^(?<Key>.*?)=(?<Value>.*)$", RegexOptions.Compiled);
private static readonly Regex ColorRegex = new Regex(@"\[A:\s?(?<A>[0-9]{1,3}),\s?R:\s?(?<R>[0-9]{1,3}),\s?G:\s?(?<G>[0-9]{1,3}),\s?B:\s?(?<B>[0-9]{1,3})\]", RegexOptions.Compiled);
public static readonly Dictionary<Type, object> ConfigObjects = new Dictionary<Type, object>();
private static readonly Dictionary<Type, Dictionary<string, Dictionary<string, string>>> ConfigContents = new Dictionary<Type, Dictionary<string, Dictionary<string, string>>>();
public static void Load()
{
Type[] types = Assembly.GetEntryAssembly().GetTypes();
foreach (Type type in types)
{
ConfigPath config = type.GetCustomAttribute<ConfigPath>();
if (config == null) continue;
object ob = null;
if (!type.IsAbstract || !type.IsSealed)
ConfigObjects[type] = ob = Activator.CreateInstance(type);
ReadConfig(type, config.Path, ob);
}
}
public static void Save()
{
Type[] types = Assembly.GetEntryAssembly().GetTypes();
foreach (Type type in types)
{
ConfigPath config = type.GetCustomAttribute<ConfigPath>();
if (config == null) continue;
object ob = null;
if (!type.IsAbstract || !type.IsSealed)
ob = ConfigObjects[type];
SaveConfig(type, config.Path, ob);
}
}
private static void ReadConfig(Type type, string path, object ob)
{
if (!File.Exists(path)) return;
PropertyInfo[] properties = type.GetProperties();
Dictionary<string, Dictionary<string, string>> contents = ConfigContents[type] = new Dictionary<string, Dictionary<string, string>>();
string[] lines = File.ReadAllLines(path);
Dictionary<string, string> section = null;
foreach (string line in lines)
{
Match match = HeaderRegex.Match(line);
if (match.Success)
{
section = new Dictionary<string, string>();
contents[match.Groups["Header"].Value] = section;
continue;
}
if (section == null) continue;
match = EntryRegex.Match(line);
if (!match.Success) continue;
section[match.Groups["Key"].Value] = match.Groups["Value"].Value;
}
string lastSection = null;
foreach (PropertyInfo property in properties)
{
ConfigSection config = property.GetCustomAttribute<ConfigSection>();
if (config != null) lastSection = config.Section;
if (lastSection == null) continue;
MethodInfo method = typeof(ConfigReader).GetMethod("Read", new[] { typeof(Type), typeof(string), typeof(string), property.PropertyType });
property.SetValue(ob, method.Invoke(null, new[] { type, lastSection, property.Name, property.GetValue(ob) }));
}
}
private static void SaveConfig(Type type, string path, object ob)
{
PropertyInfo[] properties = type.GetProperties();
Dictionary<string, Dictionary<string, string>> contents = ConfigContents[type] = new Dictionary<string, Dictionary<string, string>>();
string lastSection = null;
foreach (PropertyInfo property in properties)
{
ConfigSection config = property.GetCustomAttribute<ConfigSection>();
if (config != null) lastSection = config.Section;
if (lastSection == null) continue;
MethodInfo method = typeof(ConfigReader).GetMethod("Write", new[] { typeof(Type), typeof(string), typeof(string), property.PropertyType });
method.Invoke(ob, new[] { type, lastSection, property.Name, property.GetValue(ob) });
}
List<string> lines = new List<string>();
foreach (KeyValuePair<string, Dictionary<string, string>> header in contents)
{
lines.Add($"[{header.Key}]");
foreach (KeyValuePair<string, string> entries in header.Value)
lines.Add($"{entries.Key}={entries.Value}");
lines.Add(string.Empty);
}
if (!Directory.Exists(Path.GetDirectoryName(path)))
Directory.CreateDirectory(Path.GetDirectoryName(path));
File.WriteAllLines(path, lines, Encoding.Unicode);
}
private static bool TryGetEntry(Type type, string section, string key, out string value)
{
value = null;
Dictionary<string, Dictionary<string, string>> contents;
Dictionary<string, string> entries;
if (!ConfigContents.TryGetValue(type, out contents))
ConfigContents[type] = contents = new Dictionary<string, Dictionary<string, string>>();
if (contents.TryGetValue(section, out entries))
return entries.TryGetValue(key, out value);
entries = new Dictionary<string, string>();
contents[section] = entries;
return false;
}
#region Reads
public static Boolean Read(Type type,string section, string key, Boolean value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
Boolean result;
if (Boolean.TryParse(entry, out result))
return result;
}
ConfigContents[type][section][key] = value.ToString();
return value;
}
public static Byte Read(Type type, string section, string key, Byte value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
Byte result;
if (Byte.TryParse(entry, out result))
return result;
}
ConfigContents[type][section][key] = value.ToString();
return value;
}
public static Int16 Read(Type type, string section, string key, Int16 value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
Int16 result;
if (Int16.TryParse(entry, out result))
return result;
}
ConfigContents[type][section][key] = value.ToString();
return value;
}
public static Int32 Read(Type type, string section, string key, Int32 value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
Int32 result;
if (Int32.TryParse(entry, out result))
return result;
}
ConfigContents[type][section][key] = value.ToString();
return value;
}
public static Int64 Read(Type type, string section, string key, Int64 value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
Int64 result;
if (Int64.TryParse(entry, out result))
return result;
}
ConfigContents[type][section][key] = value.ToString();
return value;
}
public static SByte Read(Type type, string section, string key, SByte value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
SByte result;
if (SByte.TryParse(entry, out result))
return result;
}
ConfigContents[type][section][key] = value.ToString();
return value;
}
public static UInt16 Read(Type type, string section, string key, UInt16 value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
UInt16 result;
if (UInt16.TryParse(entry, out result))
return result;
}
ConfigContents[type][section][key] = value.ToString();
return value;
}
public static UInt32 Read(Type type, string section, string key, UInt32 value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
UInt32 result;
if (UInt32.TryParse(entry, out result))
return result;
}
ConfigContents[type][section][key] = value.ToString();
return value;
}
public static UInt64 Read(Type type, string section, string key, UInt64 value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
UInt64 result;
if (UInt64.TryParse(entry, out result))
return result;
}
ConfigContents[type][section][key] = value.ToString();
return value;
}
public static Single Read(Type type, string section, string key, Single value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
Single result;
if (Single.TryParse(entry, out result))
return result;
}
ConfigContents[type][section][key] = value.ToString(CultureInfo.InvariantCulture);
return value;
}
public static Double Read(Type type, string section, string key, Double value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
Double result;
if (Double.TryParse(entry, out result))
return result;
}
ConfigContents[type][section][key] = value.ToString(CultureInfo.InvariantCulture);
return value;
}
public static Decimal Read(Type type, string section, string key, Decimal value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
Decimal result;
if (Decimal.TryParse(entry, out result))
return result;
}
ConfigContents[type][section][key] = value.ToString(CultureInfo.InvariantCulture);
return value;
}
public static Char Read(Type type, string section, string key, Char value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
Char result;
if (Char.TryParse(entry, out result))
return result;
}
ConfigContents[type][section][key] = value.ToString();
return value;
}
public static String Read(Type type, string section, string key, String value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
return entry;
ConfigContents[type][section][key] = value;
return value;
}
public static Point Read(Type type, string section, string key, Point value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
string[] data = entry.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
int x, y;
if (data.Length == 2 && int.TryParse(data[0], out x) && int.TryParse(data[1], out y))
return new Point(x, y);
}
ConfigContents[type][section][key] = $"{value.X}, {value.Y}";
return value;
}
public static Size Read(Type type, string section, string key, Size value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
string[] data = entry.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
int width, height;
if (data.Length == 2 && int.TryParse(data[0], out width) && int.TryParse(data[1], out height))
return new Size(width, height);
}
ConfigContents[type][section][key] = $"{value.Width}, {value.Height}";
return value;
}
public static SizeF Read(Type type, string section, string key, SizeF value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
string[] data = entry.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
float width, height;
if (data.Length == 2 && float.TryParse(data[0], out width) && float.TryParse(data[1], out height))
return new SizeF(width, height);
}
ConfigContents[type][section][key] = $"{value.Width}, {value.Height}";
return value;
}
public static TimeSpan Read(Type type, string section, string key, TimeSpan value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
TimeSpan result;
if (TimeSpan.TryParse(entry, out result))
return result;
}
ConfigContents[type][section][key] = value.ToString();
return value;
}
public static DateTime Read(Type type, string section, string key, DateTime value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
DateTime result;
if (DateTime.TryParse(entry, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
return result;
}
ConfigContents[type][section][key] = value.ToString(CultureInfo.InvariantCulture);
return value;
}
public static Color Read(Type type, string section, string key, Color value)
{
string entry;
if (TryGetEntry(type, section, key, out entry))
{
Match match = ColorRegex.Match(entry);
if (match.Success)
{
int a = int.Parse(match.Groups["A"].Value);
int r = int.Parse(match.Groups["R"].Value);
int g = int.Parse(match.Groups["G"].Value);
int b = int.Parse(match.Groups["B"].Value);
return Color.FromArgb(
Math.Min(Byte.MaxValue, Math.Max(Byte.MinValue, a)),
Math.Min(Byte.MaxValue, Math.Max(Byte.MinValue, r)),
Math.Min(Byte.MaxValue, Math.Max(Byte.MinValue, g)),
Math.Min(Byte.MaxValue, Math.Max(Byte.MinValue, b)));
}
}
ConfigContents[type][section][key] = $"[A:{value.A}, R:{value.R}, G:{value.G}, B:{value.B}]";
return value;
}
#endregion
#region Writes
public static void Write(Type type, string section, string key, Boolean value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value.ToString();
}
public static void Write(Type type, string section, string key, Byte value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value.ToString();
}
public static void Write(Type type, string section, string key, Int16 value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value.ToString();
}
public static void Write(Type type, string section, string key, Int32 value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value.ToString();
}
public static void Write(Type type, string section, string key, Int64 value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value.ToString();
}
public static void Write(Type type, string section, string key, SByte value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value.ToString();
}
public static void Write(Type type, string section, string key, UInt16 value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value.ToString();
}
public static void Write(Type type, string section, string key, UInt32 value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value.ToString();
}
public static void Write(Type type, string section, string key, UInt64 value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value.ToString();
}
public static void Write(Type type, string section, string key, Single value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value.ToString(CultureInfo.InvariantCulture);
}
public static void Write(Type type, string section, string key, Double value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value.ToString(CultureInfo.InvariantCulture);
}
public static void Write(Type type, string section, string key, Decimal value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value.ToString(CultureInfo.InvariantCulture);
}
public static void Write(Type type, string section, string key, Char value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value.ToString();
}
public static void Write(Type type, string section, string key, String value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value;
}
public static void Write(Type type, string section, string key, Point value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = $"{value.X}, {value.Y}";
}
public static void Write(Type type, string section, string key, Size value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = $"{value.Width}, {value.Height}";
}
public static void Write(Type type, string section, string key, TimeSpan value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value.ToString();
}
public static void Write(Type type, string section, string key, DateTime value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = value.ToString(CultureInfo.InvariantCulture);
}
public static void Write(Type type, string section, string key, Color value)
{
if (!ConfigContents[type].ContainsKey(section)) ConfigContents[type][section] = new Dictionary<string, string>();
ConfigContents[type][section][key] = $"[A:{value.A}, R:{value.R}, G:{value.G}, B:{value.B}]";
}
#endregion
}
[AttributeUsage(AttributeTargets.Class)]
public class ConfigPath : Attribute
{
public string Path { get; set; }
public ConfigPath(string path)
{
Path = path;
}
}
[AttributeUsage(AttributeTargets.Property)]
public class ConfigSection : Attribute
{
public string Section { get; set; }
public ConfigSection(string section)
{
Section = section;
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。