繁体   English   中英

演员收到 object 到列表<object>或 IEnumerable<object><div id="text_translate"><p> 我正在尝试执行以下演员</p><pre>private void MyMethod(object myObject) { if(myObject is IEnumerable) { List&lt;object&gt; collection = (List&lt;object&gt;)myObject; ... do something } else {... do something } }</pre><p> 但我总是以以下异常结束:</p><p> 无法将“System.Collections.Generic.List 1[MySpecificType]' to type 'System.Collections.Generic.List</p><p> 我真的需要这个工作,因为这个方法需要非常通用才能接收单个对象和 collections 两种未指定的类型。</p><p> 这是可能的,还是有另一种方法可以做到这一点。</p><p> 谢谢你。</p></div></object></object>

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

将 object 投到列表中<object><div id="text_translate"><p>由于某些我无法控制的原因,需要定义我的一种方法来接受 object 类型的一个参数。 但我知道这个参数的值实际上是 List 类型,带有一个我不知道的通用参数。</p><p> 我正在尝试将此 object 转换为 List&lt;object&gt;,但不知道如何在不知道确切的通用参数是什么的情况下执行此操作。</p><p> 我想做这样的事情:</p><pre> public static List&lt;object&gt; ConvertToList(object input) { if (input.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(List&lt;&gt;))) { //Of course this does not work, because input might for example be of type List&lt;string&gt; return (List&lt;object&gt;) input; } else { return null; } }</pre><p> 我知道,如果我有List&lt;T&gt;而不是object input ,使用以下方法会很容易:</p><pre> return input.Cast&lt;object&gt;()</pre><p> 但不幸的是,我坚持使用 object 参数。 知道如何解决这个问题吗?</p></div></object>

[英]Cast object to List<object>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 投IEnumerable <object> 列表 <object> 将对象转换为IEnumerable <object> ? 从IEnumerable转换为IEnumerable <object> Cast List之间的区别是什么? <object> 和Cast IEnumerable <object> 将对象转换为IEnumerable 如何投射IEnumerable <object> 到一个IEnumerable <runtime type> 为什么IEnumerable <struct> 转换为IEnumerable <object> ? 将 object 投到列表中<object><div id="text_translate"><p>由于某些我无法控制的原因,需要定义我的一种方法来接受 object 类型的一个参数。 但我知道这个参数的值实际上是 List 类型,带有一个我不知道的通用参数。</p><p> 我正在尝试将此 object 转换为 List&lt;object&gt;,但不知道如何在不知道确切的通用参数是什么的情况下执行此操作。</p><p> 我想做这样的事情:</p><pre> public static List&lt;object&gt; ConvertToList(object input) { if (input.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(List&lt;&gt;))) { //Of course this does not work, because input might for example be of type List&lt;string&gt; return (List&lt;object&gt;) input; } else { return null; } }</pre><p> 我知道,如果我有List&lt;T&gt;而不是object input ,使用以下方法会很容易:</p><pre> return input.Cast&lt;object&gt;()</pre><p> 但不幸的是,我坚持使用 object 参数。 知道如何解决这个问题吗?</p></div></object> 演员表 <object> 到IEnumerable <T> 一般任务中 AutoFixture:解析 IEnumerable<t> ,无法将“ConvertedEnumerable”类型的 object 转换为列表</t>
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM