Подтвердить что ты не робот

Передача полученного объекта в список <объект> или IEnumerable <объект>

Я пытаюсь выполнить следующий листинг

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]'

Мне действительно нужно, чтобы это работало, потому что этот метод должен быть очень общим для получения отдельных объектов и коллекций как неопределенных типов.

Возможно ли это, или есть другой способ сделать это.

Спасибо.

4b9b3361

Ответ 1

С# 4 будет иметь ковариантные и контравариантные параметры шаблона, но до этого вам нужно сделать что-то неживое, например

IList collection = (IList)myObject;

Ответ 2

Вы не можете использовать IEnumerable <T> к списку <T> .

Но вы можете выполнить это с помощью LINQ:

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

Ответ 3

Проблема в том, что вы пытаетесь перейти к более богатому объекту. Вам просто нужно добавить элементы в новый список:

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

Ответ 4

Вам действительно нужна дополнительная информация, чем простой IEnumerable дает вам? Просто примените его к этому и используйте с ним foreach. Я сталкиваюсь с той же ситуацией в некоторых битах протокольных буферов, и я обнаружил, что отличное отключение к IEnumerable (или IList для доступа к нему, как списку) работает очень хорошо.

Ответ 5

Как насчет

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

Ответ 6

Приходите присоединиться к веселью...

    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

Этот код работал у меня

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

Ответ 8

Вам нужно набрать текст, используя как, как это.

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