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

时间:2009-03-10 22:42:38

标签: c# .net

我正在尝试执行以下演员

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

但我总是得到以下例外:

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

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

这是可能的,还是有其他方法可以实现这一点。

谢谢。

8 个答案:

答案 0 :(得分:64)

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

IList collection = (IList)myObject;

答案 1 :(得分:52)

你无法施放IEnumerable&lt; T&gt;列表&lt; T&gt;。

但你可以使用LINQ来实现这个目的:

var result = ((IEnumerable)myObject).Cast<object>().ToList();

答案 2 :(得分:10)

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

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

答案 3 :(得分:9)

您真的需要比普通IEnumerable给出的更多信息吗?只需将其强制转换为使用foreach即可。我在一些协议缓冲区中遇到了完全相同的情况,我发现转换为IEnumerable(或IList以便像列表一样访问它)效果非常好。

答案 4 :(得分:3)

怎么样

List<object> collection = new List<object>((IEnumerable)myObject);

答案 5 :(得分:3)

本规范对我有用

List<Object> collection = new List<Object>((IEnumerable<Object>)myObject);

答案 6 :(得分:3)

必须加入乐趣...

    private void TestBench()
    {
        // An object to test
        string[] stringEnumerable = new string[] { "Easy", "as", "Pi" };

        ObjectListFromUnknown(stringEnumerable);
    }

    private void ObjectListFromUnknown(object o)
    {
        if (typeof(IEnumerable<object>).IsAssignableFrom(o.GetType()))
        {
            List<object> listO = ((IEnumerable<object>)o).ToList();
            // Test it
            foreach (var v in listO)
            {
                Console.WriteLine(v);
            }
        }
    }

答案 7 :(得分:0)

您需要使用作为运算符输入强制转换。

private void MyMethod(object myObject)  
{  
if(myObject is IEnumerable)  
{
    List<object> collection = myObject as(List<object>); 
    ... do something   
}  
else  
{  
    ... do something  
}  
}