var custsType = Type.GetType("Customers");
var customers = Json.Deserialize<custsType>(data);
这显然是失败的。如何通过字符串名称引用类,以便在运行时提供它?
此外,我需要能够访问实际的强类型对象,而不是它的字符串表示。。
var custsType = Type.GetType("Customers");
var customers = JsonConvert.DeserializeObject(data, custsType);
问题是,如果对象的类型不确定,您将很难使用该对象。假设类型名称是一个参数,否则您只需要完成
var customers = JsonConvert.DeserializeObject<Customers>(data);
这表明在编译时您不知道期望返回什么类型。问题是,如果你在编译时不知道类型,那么一旦得到对象,你就不清楚该怎么处理
如果你打算访问对象的任何属性,那么你必须事先对对象的类型有一些假设。否则,你就不会期望反序列化的对象具有该属性。
挑战不在于如何解决问题,而在于如何重新考虑方法,这样你一开始就不会遇到问题。
理想情况下,您想知道在编译时所期望的类型,它再次看起来像这样:
var customers = JsonConvert.DeserializeObject<Customers>(data, custsType);
然后,如果数据无法反序列化为预期的类型,则会引发异常,因为调用者必须传递正确的类型。
如果你发现自己处于这样一个位置:a)你不知道类型是什么,或者b)你必须使用反射来查找属性,那么就出现了问题,最好在修复之前进行备份。
试图访问这样的属性:
var name = myObject["Name"];
比反射更容易,但它最终与是一样的
var property = myObject.GetType().GetProperty("Name");
var name = property.GetValue(myObject);
在这两种情况下,你都不知道是否会有一个";名称";财产与否。任何将对象解析为JSON的方法都只是在幕后使用反射。
使用Json.Net指定类型名称处理程序:
new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full
}
请参阅:https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm