[英]Converting object (List<string>) to List<object>
我试图为REST-API测试编写一个小框架。 我使用了大量的反思并遇到了一个我无法帮助自己的问题。
我使用这一行来提取用户给我作为路径的变量(字符串)
object o = input.GetType().GetProperty(name).propertyInfo.GetValue(input, null);
该对象可以是普通类型T
或List<T>
。 现在,如果它是一个List,我知道类型一切都很简单,我可以使用
List<string> l = (List<string>)o; // I know its a List<string> because the user told me
将对象解析为给定数组。 但我并不总是知道列表中对象的类型
List<object> l = (List<object>)o; // I dont know the type and I dont care
给了我一个错误。
“System.Collection.GenericList [System.String]”类型的对象无法转换为“System.Collection.GenericList [System.Object]”
我有什么办法可以收到物品清单吗? 我不希望用户指定类型,因为它只是我想要关注的最后一个变量。 喜欢
用户想要测试“object1.abc”我只需要知道c的类型,因为那是测试运行的地方。
TIA
您可以将其转换为IEnumerable<object>
,但不能将其转换为List<object>
。 原因是:香蕉清单不是水果清单,因为你可以把苹果放入水果清单,但不能放入香蕉清单。 由于这两种类型允许不同的操作,因此它们不兼容。
序列没有“投入”操作,因此可以使用香蕉列表作为一系列水果。 同样,您可以使用字符串列表作为对象序列 ,但不能使用对象列表 。
此功能称为通用协方差; 有关更多信息,请搜索C#协方差,您将找到大量文章解释它是如何工作的。
特别注意,协方差仅适用于引用类型; 您不能使用整数序列作为对象序列。 你明白为什么吗?
或者,如果您手头有IEnumerable
,则可以使用mysequence.Cast<object>().ToList()
将 任何序列的副本复制到对象列表中。 但这是一个副本,而不是参考转换。
由于您的问题始于处理作为JSON到达服务器的动态对象,因此在转换为POCO之前使用JSON Processing库本身来测试某些特性非常方便。 使用newtonsoft的JSON.Net,
var o = JObject.Parse(json);
JToken property = o["a"]["b"]["c"];
if (property != null)
{
if (property.Type == JTokenType.Array)
{
// Process property as array
}
else if (property.Type == JTokenType.Object)
{
// Process property as object
}
// Magnitude of other types
}
我确实理解在最终处理之前需要转换为.NET类型,但我强烈建议从JObject开始,因为库是为此目的而设计的,并为C#本身不提供的许多动态操作提供了许多便利方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.