C# 在运行时将 Enumerable.Iterator 强制转换为已知 List<Object>

Posted

技术标签:

【中文标题】C# 在运行时将 Enumerable.Iterator 强制转换为已知 List<Object>【英文标题】:C# Cast Enumerable.Iterator to known List<Object> at run time 【发布时间】:2018-12-01 01:41:23 【问题描述】:

我有一个方法,我只能在运行时检索对象类型。我试图将它转换为已知对象的列表,但我失败了。

  private string outputParamForListOrDict(IMethodReturn returnValue)
    
        StringBuilder sb = new StringBuilder();
        String outputString = string.Empty;

        switch (returnValue.ReturnValue.GetType().GetGenericArguments()[0].Name)
               

            case nameof(ViewDocumentReport):

                List<ViewDocumentReport> _viewDocumentParam = (List<ViewDocumentReport>)returnValue.ReturnValue;

                //process the data here........

                return sb.ToString();

            //Other object cases

         
    

我在下面遇到了一个异常:

"Unable to cast object of type >'<TakeIterator>d__25`1[ezAcquire.RMS.Model.ViewModels.ViewDocumentReport]' to type 'System.Collections.Generic.List`1[ezAcquire.RMS.Model.ViewModels.ViewDocumentReport]'."

我在调试模式下设置了一个断点。 我的 returnValue.ReturnValue 是

如果我展开,我可以看到列表列表。

有人可以向我解释 d_25 是什么意思,并建议我在运行时如何正确转换它吗?

谢谢

【问题讨论】:

returnValue.ReturnValue 是对象类型,它没有 .Cast 方法。查看以下链接:msdn.microsoft.com/en-us/library/…我使用的是framework 4.6.2,你来自不同的版本吗? 不,我只是不知道你的模型的细节。在尝试将其设为列表之前,您可能需要转换为 IEnumerable&lt;ViewDocumentReport&gt; 【参考方案1】:

如果您确定您的对象是您知道的类型的 IEnumerable,则可以在执行 ToList 之前将该对象强制转换为 IEnumerable&lt;T&gt;

public class Test 



void Main()

    object x = Enumerable.Range(0,100).Select(_ => new Test()).Take(15);
    List<Test> fail = (List<Test>)x; // InvalidCastException: Unable to cast object of type '<TakeIterator>d__25`1[UserQuery+Test]' to type 'System.Collections.Generic.List`1[UserQuery+Test]'.
    List<Test> pass = ((IEnumerable<Test>)x).ToList(); // No problem

如您所见,直接从IEnumerable&lt;T&gt; 转换为List&lt;T&gt; 不是有效的转换。您需要先将 object 转换为 IEnumerable,然后再将其输入 List&lt;T&gt; 构造函数或使用 Linq 的 ToList 方法。

【讨论】:

你猜对了,我会将此标记为正确答案。

以上是关于C# 在运行时将 Enumerable.Iterator 强制转换为已知 List<Object>的主要内容,如果未能解决你的问题,请参考以下文章

C# 在运行时将 Enumerable.Iterator 强制转换为已知 List<Object>

在运行时将实体对象添加到 LINQ-to-SQL 数据上下文 - SQL、C#(WPF)

如何在构建时将其他文件包含到 C# 的输出目录中?

c# Outlook VSTO 插件,当邮箱处于仅标头模式时将下载新邮件

如何在实例化时将值插入 C# 字典?

在构建时将 C++ 结构转换为 C# 结构