使用反射从通用列表转换为特定列表
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"。所以这样,我可以创建一个我想要的实例,然后添加它。有效!
我正在用 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"。所以这样,我可以创建一个我想要的实例,然后添加它。有效!