繁体   English   中英

转换对象(列表 <string> )列表 <object>

[英]Converting object (List<string>) to List<object>

我试图为REST-API测试编写一个小框架。 我使用了大量的反思并遇到了一个我无法帮助自己的问题。

我使用这一行来提取用户给我作为路径的变量(字符串)

object o = input.GetType().GetProperty(name).propertyInfo.GetValue(input, null);

该对象可以是普通类型TList<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM