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

我正在尝试执行下面的演员

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

但是我总是会得到以下的帮助:

无法1[MySpecificType]' to type 'System.Collections.Generic.Listtypes为“System.Collections.Generic.List 1[MySpecificType]' to type 'System.Collections.Generic.List 1 [System.Object]”

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

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

谢谢。

C#4将具有协变和逆变模板参数,但在此之前,您必须执行一些非通用的操作

 IList collection = (IList)myObject; 

您不能将IEnumerable <T>强制转换为List <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); 

必须join乐趣…

  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); 

你需要使用像这样的运算符来input。

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