Ответ 1
С# 4 будет иметь ковариантные и контравариантные параметры шаблона, но до этого вам нужно сделать что-то неживое, например
IList collection = (IList)myObject;
Я пытаюсь выполнить следующий листинг
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]'
Мне действительно нужно, чтобы это работало, потому что этот метод должен быть очень общим для получения отдельных объектов и коллекций как неопределенных типов.
Возможно ли это, или есть другой способ сделать это.
Спасибо.
С# 4 будет иметь ковариантные и контравариантные параметры шаблона, но до этого вам нужно сделать что-то неживое, например
IList collection = (IList)myObject;
Вы не можете использовать IEnumerable <T> к списку <T> .
Но вы можете выполнить это с помощью LINQ:
var result = ((IEnumerable)myObject).Cast<object>().ToList();
Проблема в том, что вы пытаетесь перейти к более богатому объекту. Вам просто нужно добавить элементы в новый список:
if (myObject is IEnumerable)
{
List<object> list = new List<object>();
var enumerator = ((IEnumerable) myObject).GetEnumerator();
while (enumerator.MoveNext())
{
list.Add(enumerator.Current);
}
}
Вам действительно нужна дополнительная информация, чем простой IEnumerable
дает вам? Просто примените его к этому и используйте с ним foreach
. Я сталкиваюсь с той же ситуацией в некоторых битах протокольных буферов, и я обнаружил, что отличное отключение к IEnumerable
(или IList
для доступа к нему, как списку) работает очень хорошо.
Как насчет
List<object> collection = new List<object>((IEnumerable)myObject);
Приходите присоединиться к веселью...
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);
}
}
}
Этот код работал у меня
List<Object> collection = new List<Object>((IEnumerable<Object>)myObject);
Вам нужно набрать текст, используя как, как это.
private void MyMethod(object myObject)
{
if(myObject is IEnumerable)
{
List<object> collection = myObject as(List<object>);
... do something
}
else
{
... do something
}
}