在类型参数中引用字符串名称中的类型

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即可。