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