从运行库中动态加载Newtonsoft.Json,使用Json序列化和反序列化。加载库时可以使用AppDomain.CurrentDomain.Load()。
public static class JsonConvert
{
const string assemblyName = "Newtonsoft.Json";
const string className = "JsonConvert";
const string sMth_Name = "SerializeObject";
const string dMth_Name = "DeserializeObject";
static Act CurrAct;
public static string SerializeObject(object value)
{
Init();
object r = CurrAct.SerializeObject(value);
return r == null ? null : r.ToString();
}
public static T DeserializeObject<T>(string value)
{
Init();
object r = CurrAct.DeserializeObject(value, typeof(T));
if (r == null) return default(T);
return (T)r;
}
private static void Init()
{
if (CurrAct != null) return;
// 加载 Newtonsoft.Json
AppDomain.CurrentDomain.Load(assemblyName);
Assembly JsonAssembly = AppDomain.CurrentDomain.GetAssemblies().Where(o => o.GetName().Name == assemblyName).FirstOrDefault();
if (JsonAssembly == null)
{
throw new Exception(string.Format("未能加载到程序集 {0}.dll", assemblyName));
return;
}
Type cvtClass = JsonAssembly.GetType(assemblyName + "." + className);
var m_s = cvtClass.GetMethod(sMth_Name, new Type[] { typeof(object) });
var m_d = cvtClass.GetMethod(dMth_Name, new Type[] { typeof(string), typeof(Type) });
CurrAct = new Act(m_s, m_d);
}
class Act
{
public delegate object DeserializeObjectHandler(string value, Type type);
public delegate string SerializeObjectHandler(object value);
private DeserializeObjectHandler Dlg_DeserializeObject;
private SerializeObjectHandler Dlg_SerializeObject;
public Act(MethodInfo mtd_serializeobject, MethodInfo mtd_deserializeobject)
{
Dlg_DeserializeObject = (DeserializeObjectHandler)Delegate.CreateDelegate(typeof(DeserializeObjectHandler), mtd_deserializeobject);
Dlg_SerializeObject = (SerializeObjectHandler)Delegate.CreateDelegate(typeof(SerializeObjectHandler), mtd_serializeobject);
}
public DeserializeObjectHandler DeserializeObject
{
get
{
return Dlg_DeserializeObject;
}
}
public SerializeObjectHandler SerializeObject
{
get
{
return Dlg_SerializeObject;
}
}
}
}