C#在运行时将Enumerable.Iterator转换为已知的List <object>

时间:2018-06-21 16:24:02

标签: c# list casting enumerable custom-object

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

  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是System.Linq.Enumrable.<TakeIterator>

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

List<ViewDocumentREport>

有人可以向我解释d_25的含义,并建议我在运行时如何正确投射它吗?

谢谢

1 个答案:

答案 0 :(得分:2)

如果您确定自己的对象是已知类型的IEnumerable,则可以在执行IEnumerable<T>之前将对象强制转换为ToList

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<T>List<T>进行铸造是无效的,如您所见。您需要先将object强制转换为IEnumerable,然后再将其输入List<T>构造函数中或使用Linq的ToList方法。