提问人:user1314926 提问时间:6/6/2022 最后编辑:user1314926 更新时间:6/6/2022 访问量:59
从存储值类型列表的对象强制转换为对象列表时出现问题 [duplicate]
Problem with casting from an object storing a list of value types to a list of objects [duplicate]
问:
我有一个将对象作为输入的函数。只有各种 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 来调用任何方法。我只有对象,所以我需要先做一些铸造。
答:
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)
{
}
}
评论
IEnumerable
object
IEnumerable<object>
var myList = ((IEnumerable)collection).Cast<object>();