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

时间:2017-11-03 18:11:44

标签: c#

var custsType = Type.GetType("Customers");          
var customers = Json.Deserialize<custsType>(data);

这显然失败了。如何通过字符串名称引用类,以便我可以在运行时提供它?

此外,我需要能够访问实际的强类型对象,而不是其字符串表示。

修改 这不是骗局。参考SO帖子不会返回强类型。只有动态对象。我还是没有答案

2 个答案:

答案 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,只需在幕后使用反射。