我正在用Reflection做一些工作。我的API收到一些JSON,我想将它转换为它的类型列表。
在
中public override bool TrySetMember(SetMemberBinder binder,object value)
我有一个缓存的属性列表,其中一个是List。我知道这是真的,因为我可以从prop.PropertyType看到。
我想将此属性转换为Foo类型的实际列表,但我似乎无法执行此操作。我能得到的最好的是List。 value是Foo的json数组(所以有人在数组[]中将JSON作为Foo发送给我。
//this works, and listOfObjects is of type List<Foo> when I go deep into the quick watch of it, but it's still a list<Object> in the end.
var listOfObjects = JsonConvert.DeserializeObject<List<Object>>(value.ToString());
我可以直接将listOfObjects转换为List,这样可行,但问题是Foo可以是任何类型,例如Bar也是可以的。所以这里有无限可能的类型就是我所说的。当我进行演员表演时,有什么方法可以让它成为Foo吗?我可以从我的房产信息中获取“Foo”类型?我总是能够找到我想要将其转换为使用属性信息的类型,但那又是什么?我不能用变量做一个演员吗?
谢谢!
答案 0 :(得分:1)
我不能用变量做一个演员吗?
即使你可以,你会把那个变量键入什么?您只能使用静态类型语言中的最小公分母,并且在编译时您所知道的就是您有一个对象列表。
找出类型后,可以使用Enumerable.Cast<T>()
将其转换为适当的类型,但仍需要静态类型。
或者只是说你无法根据你的要求弄明白,只需使用dynamic
。这是它的目的(除了COM互操作),通过简单的鸭子打字来处理未知类型。
答案 1 :(得分:0)
所以你就是这样做的:
使用DeserializeObject函数:
JsonConvert.DeserializeObject(jsonstring, prop.PropertyType.GenericTypeArguments[0]);
我现在可以说“对于给定的json字符串,根据当前属性类型将其强制转换为此类型”。所以这样,我可以创建一个我想要的实例,然后添加它。它有效!