我有一個公共靜態類設置,我在那裏存放一些公共靜態字段:與JsonConvert.DeserializeObject <T>動態鑄造在靜態類在C#
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.IO;
using System.Reflection;
namespace testApp {
public static class Settings {
public static int appWidth = 800;
public static int appHeight = 600;
public static int layotCols = 1;
public static int layotRows = 1;
public static string TestString = "test";
public static double TestFloat = 1.4;
public static string[] TestStringArray = new[] { "1", "ee", "rrr"};
public static List<string> TestStringArray1 = new List<string>() { "1", "2"};
public static Dictionary<string,string> TestStringArray2 = new Dictionary<string, string> { { "key1", "value1" }, { "key2", "value2" } };
}
}
現在我想所有的字段保存到文件,但是可以添加新的字段而無需保存並將其讀取爲「手動」。
我決定使用我的動態和反射技能,並列出所有的字段到ExpandoObject,然後到JObject,然後File.WriteAllText到「settings.ini」... 不可信,但它適用於所有Newtonsoft.Json可以序列化的字段類型:
public static void saveSettings() {
Type type = typeof(Settings); // Settings is static class with static properties
dynamic dObject = new ExpandoObject();
var exObject = dObject as IDictionary<String, object>;
foreach(var setting in type.GetFields(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public)) {
exObject[setting.Name] = Convert.ChangeType(setting.GetValue(null), setting.FieldType);
}
JObject obj = new JObject();
obj = JObject.FromObject(dObject);
File.WriteAllText("settings.ini", obj.ToString());
}
但是現在我有一些麻煩閱讀這個文本文件。 我用反射的非標準方法,可以只讀夫婦的數據類型,但陣列和其他的:很多類型
public static void loadSettings() {
var settingsFile = File.ReadAllText("settings.ini");
JObject obj = JObject.Parse(settingsFile);
Type type = typeof(Settings);
foreach(var setting in type.GetFields(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public)) {
if(obj[setting.Name]?.ToString() != null) {
setting.SetValue(setting, Convert.ChangeType(obj[setting.Name],setting.FieldType));
}
}
}
我發現,那Newtonsoft.Json也可以反序列化和流延用對象JsonConvert.DeserializeObject(對象)。我試過:
setting.SetValue(setting, JsonConvert.DeserializeObject<setting.FieldType>(obj[setting.Name].ToString()));
但它給編譯錯誤...你能幫我嗎?
謝謝你的男人!有用!我將你的答案標記爲「正確」,但是會使用heinzbeinz中的方法與「out of box」Json序列化。 – Breket