var custsType = Type.GetType("Customers");
var customers = Json.Deserialize<custsType>(data);
这显然失败了。如何通过字符串名称引用类,以便我可以在运行时提供它?
此外,我需要能够访问实际的强类型对象,而不是其字符串表示。
修改 这不是骗局。参考SO帖子不会返回强类型。只有动态对象。我还是没有答案
答案 0 :(得分:0)
使用Json.Net指定类型名称处理程序:
new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full
}
请参阅:https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm
答案 1 :(得分:0)
var custsType = Type.GetType("Customers");
var customers = JsonConvert.DeserializeObject(data, custsType);
问题是如果对象的类型不确定,你将难以使用该对象。大概是类型名称是一个参数,否则你刚刚完成了
var customers = JsonConvert.DeserializeObject<Customers>(data);
它表明在编译时你不知道你希望它返回什么类型。问题在于,如果你在编译时不知道类型,那么一旦你得到它就不清楚你可以用这个对象做什么。
如果您打算访问该对象的任何属性,那么您必须预先考虑该对象的类型。否则,您不希望反序列化的对象具有该属性。
挑战不是如何解决问题,而是如何重新考虑这种方法,以便您首先没有问题。
理想情况下,您希望知道编译时期望的类型,它将再次显示:
var customers = JsonConvert.DeserializeObject(data, custsType);
然后,如果无法将数据反序列化为预期类型,则会抛出异常,因为调用者必须传递正确的类型。
如果你发现自己处在a)你不知道这种类型是什么的地方,或者b)你必须使用反射来找到属性,那么就会出现问题,并且最好备份直到你可以解决这个问题。
尝试访问这样的属性:
var name = myObject["Name"];
比反思更容易,但它最终与
相同var property = myObject.GetType().GetProperty("Name");
var name = property.GetValue(myObject);
在这两种情况下,您都不知道是否会有“名称”属性。无论将对象解析为JSON,只需在幕后使用反射。