[英]Cast received object to a List<object> or IEnumerable<object>
我正在尝试执行以下演员
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
我真的需要这个工作,因为这个方法需要非常通用才能接收单个对象和 collections 两种未指定的类型。
这是可能的,还是有另一种方法可以做到这一点。
谢谢你。
C# 4 将具有协变和逆变模板参数,但在那之前你必须做一些非泛型的事情
IList collection = (IList)myObject;
您不能将 IEnumerable<T> 强制转换为 List<T>。
但是您可以使用 LINQ 完成此操作:
var result = ((IEnumerable)myObject).Cast<object>().ToList();
问题是,您正试图升级到更丰富的 object。 您只需将项目添加到新列表中:
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<Object>)myObject);
怎么样
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);
}
}
}
现在是这样的:
var collection = new List<object>(objectVar);
您需要像这样使用as运算符进行类型转换。
private void MyMethod(object myObject)
{
if(myObject is IEnumerable)
{
List<object> collection = myObject as(List<object>);
... do something
}
else
{
... do something
}
}
您还可以将 object 转换为您的 DTO 列表。
首先序列化myObject
,然后将其反序列化到您的列表中。
这是代码:
List<MyDto> myList = JsonConvert.DeserializeObject<List<MyDto>>(JsonConvert.SerializeObject(myObject));
上面的代码中使用了Newtonsoft.Json
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.