使用反射从通用列表转换为特定列表

时间:2015-03-21 23:20:28

标签: c# reflection

我正在用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”类型?我总是能够找到我想要将其转换为使用属性信息的类型,但那又是什么?我不能用变量做一个演员吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

  

我不能用变量做一个演员吗?

即使你可以,你会把那个变量键入什么?您只能使用静态类型语言中的最小公分母,并且在编译时您所知道的就是您有一个对象列表。

找出类型后,可以使用Enumerable.Cast<T>()将其转换为适当的类型,但仍需要静态类型。

或者只是说你无法根据你的要求弄明白,只需使用dynamic。这是它的目的(除了COM互操作),通过简单的鸭子打字来处理未知类型。

答案 1 :(得分:0)

所以你就是这样做的:

使用DeserializeObject函数:

JsonConvert.DeserializeObject(jsonstring, prop.PropertyType.GenericTypeArguments[0]);

我现在可以说“对于给定的json字符串,根据当前属性类型将其强制转换为此类型”。所以这样,我可以创建一个我想要的实例,然后添加它。它有效!