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

Convert from generic list to specific list using reflection

我正在用 Reflection 做一些工作。我的 API 收到一些 JSON 并且我想将其转换为它的类型列表。

public override bool TrySetMember(SetMemberBinder binder, object value)

我有一个缓存的属性列表,其中之一是一个列表。我知道这是真的,因为我可以从 prop.PropertyType.

看到

我想将此 属性 转换为 Foo 类型的实际列表,但我似乎做不到。我能得到的最好的是一个列表。 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" 类型吗?我总是能够使用 属性 信息找到我想要将其转换为的类型,但是那又怎样呢?我不能用变量进行转换吗?

谢谢!

I can't do a cast with a variable right?

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

一旦确定了类型,就可以使用 Enumerable.Cast<T>() 将其强制转换为适当的类型,但您仍然需要一个静态类型来执行此操作。

或者说你自己的需求想不出来,就用dynamic。这就是它的目的(除了 COM 互操作),通过简单的鸭子输入来处理未知类型。

这就是你的做法:

使用 DeserializeObject 函数:

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

我现在可以说 "for a given json string, cast it to this type based on whatever is the property type currently"。所以这样,我可以创建一个我想要的实例,然后添加它。有效!