将接收到的对象转换为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.List
types为“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 } }