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,都只是在幕后使用反射。
关于c# - 反序列化从类型参数中的字符串名称引用类型的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47102107/