【问题标题】:Convert object (which is a List<T>) to List<object>将对象(这是一个 List<T>)转换为 List<object>
【发布时间】:2020-06-19 00:14:11
【问题描述】:

我要覆盖的方法具有以下签名。

public override bool IsValid(object value)

传入的对象是一个列表,但列表类型未知。可能是List&lt;string&gt;List&lt;int&gt;

我需要将其转换为 List&lt;object&gt;。我试过了

if (!(value is IList temp))
{
    return false;
}

List<object> list = temp.OfType<object>().ToList();

哪种有效,但它会过滤掉任何空值,大概是因为它们不是OfType&lt;object&gt;

那么最好的方法是什么?

【问题讨论】:

  • 您这样做的动机是什么。可能存在更好的方法。
  • 你试过temp.Cast&lt;object&gt;().ToList()吗?
  • 为什么不只是(List&lt;object&gt;)temp?顺便说一句,如果它有空值,它不能是 List&lt;int&gt;...
  • @HereticMonkey 因为它不会编译)

标签: c#


【解决方案1】:

temp.OfType().ToList();

OfType 检查元素是否为所需类型,如果是,则将其放入新的临时列表中。

你要问的只是一个演员表,因为 C# 中的每个实例都是 object: (List&lt;object&gt;)temp 编辑:显然协方差在这里不起作用。

但绝对没有理由这样做,您可以简单地枚举它:foreach(var obj in (IList)temp)。所有集合都实现IList 非通用接口。

【讨论】:

  • 这是一个可行的解决方案。我还需要使用 List 提供的 .All() 方法,但 IList 没有。所以 @ZoharPeled 建议 temp.Cast().ToList() 实际上对我来说更好
  • IList 不提供 All,但 Linq 提供,并且适用于每个 IEnumberableIEnumerable&lt;T&gt;。如果这是您需要的,请相应地投射它!
【解决方案2】:

如果输入是List&lt;int&gt;List&lt;string&gt; 而没有别的,那么我认为最好的方法是专门检查这些类型。所以像:

List<object> list ;
if (value is List<int> listOfInts) 
{
   list = listOfInts.Cast<object>().ToList();
} 
else if (value is List<string> listOfStrings) 
{
   list = listOfStrings.Cast<object>().ToList();
} 
else 
{
   throw new ArgumentException(...);
}

这似乎是多余的,但它可能会为您省去很多麻烦,因为如果有人通过 List&lt;SomethingElse&gt; 甚至是 List&lt;object&gt;,根据您的规范,这将是非法的。

【讨论】:

  • 不幸的是列表类型未知。 List 和 List 只是他列出的两个例子。这用于自定义验证属性。该属性可以应用于 List
猜你喜欢
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 2021-09-27
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多