将接收到的对象转换为List <object>或IEnumerable <object>

Ser*_*ero 60 .net c#

我正在尝试执行以下演员表

private void MyMethod(object myObject)  
{  
    if(myObject is IEnumerable)  
    {
        List<object> collection = (List<object>)myObject;  
        ... do something   
    }  
    else  
    {  
        ... do something  
    }  
}
Run Code Online (Sandbox Code Playgroud)

但我总是得到以下例外:

无法转换类型为'System.Collections.Generic.List 1[MySpecificType]' to type 'System.Collections.Generic.List1 [System.Object]'的对象

我真的需要这个工作,因为这个方法需要非常通用才能接收单个对象和两个未指定类型的集合.

这是可能的,还是有另一种方法来实现这一点.

谢谢.

eri*_*len 69

C#4将具有协变和逆变模板参数,但在此之前你必须做一些非泛型的事情

IList collection = (IList)myObject;
Run Code Online (Sandbox Code Playgroud)


and*_*eer 59

您不能将IEnumerable <T>转换为List <T>.

但您可以使用LINQ完成此任务:

var result = ((IEnumerable)myObject).Cast<object>().ToList();
Run Code Online (Sandbox Code Playgroud)

  • 这也是创建一个新列表,而不是铸造原始列表. (2认同)
  • 我必须使用“(IEnumerable&lt;object&gt;)”而不仅仅是“(IEnumerable)”,但在其他方面工作得很好。我用的是dotnetcore 3.0 (2认同)

Chr*_*mes 10

问题是,你正试图向上转向更丰富的对象.您只需将项目添加到新列表:

if (myObject is IEnumerable)
{
   List<object> list = new List<object>();
   var enumerator = ((IEnumerable) myObject).GetEnumerator();
   while (enumerator.MoveNext())
   {
      list.Add(enumerator.Current);
   }
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 9

你真的需要比普通的更多信息IEnumerable吗?只需将其投入使用即可foreach.我在一些协议缓冲区中遇到了完全相同的情况,并且我发现转换IEnumerable(或IList像列表一样访问它)非常有效.


Cam*_*and 5

怎么样

List<object> collection = new List<object>((IEnumerable)myObject);
Run Code Online (Sandbox Code Playgroud)


Man*_*yak 5

该守则对我有用

List<Object> collection = new List<Object>((IEnumerable<Object>)myObject);
Run Code Online (Sandbox Code Playgroud)