[英]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.