从存储值类型列表的对象强制转换为对象列表时出现问题 [duplicate]

Problem with casting from an object storing a list of value types to a list of objects [duplicate]

提问人:user1314926 提问时间:6/6/2022 最后编辑:user1314926 更新时间:6/6/2022 访问量:59

问:

我有一个将对象作为输入的函数。只有各种 T 的 List<T >将作为类型传递到这里,但由于某些外部/API 原因,参数需要保留为对象

void Receive(object collection)

我们不要讨论这是一个糟糕的设计:)假设这是一个约束。

具体情况如下。 这次我想将我的参数强制转换或转换为可枚举的对象(或者列表也可以这样做)。 同样,它必须是可枚举的/对象列表,而不是特定类型。部分原因是我不知道确切的类型。

void Receive(object collection)
{
   var myList = (IEnumerable<object>)collection;
}

令我难以置信的是,这似乎仅适用于引用类型。 当像这样调用时,它可以工作:

 Receive(new List<Foo>() { new Foo()}}

这样调用时它不起作用:

Receive(new List<int>() {2}
Receive(new List<(int,int)>() {(5,9)}

无法强制转换类型为“System.Collections.Generic.List1[System.Object] 的对象1[System.Int32]' to type 'System.Collections.Generic.IEnumerable

我想这与缺少一些值类型的转换运算符有关。

问题:

如何强制转换它,以便在引用类型或值类型列表作为参数传递时工作?

我见过人们在将特定类型的列表转换为对象列表时遇到类似的问题,但这很容易(例如,我们可以使用 ToList)。我的情况更加困难,因为我首先没有 IEnumerable 来调用任何方法。我只有对象,所以我需要先做一些铸造。

C# .NET 强制转换

评论

0赞 John 6/6/2022
您不能强制转换为该类型。我建议按照提供的答案进行转换,因为您仍然可以枚举它并获取每个项目的参考。如果出于某种原因确实需要,可以创建该类型的新对象,如下所示:.这将框列表中的每个值,并在它们上创建一个新的可枚举对象。IEnumerableobjectIEnumerable<object>var myList = ((IEnumerable)collection).Cast<object>();

答:

4赞 DotNet Developer 6/6/2022 #1

如何投射

你已经得到了错误,这意味着这是不可能的。你需要改变你的方法。

我建议将集合转换为 .您可以在 foreach 操作中使用它,并将项目视为对象。System.Collections.IEnumerable

public void Receive(object collection)
{
    var myList = (IEnumerable)collection;
    
    // value is object here
    foreach(var value in myList)
    {

    }
}