我有一个方法,其中我只能在运行时检索对象类型。我试图将其转换为已知对象的列表,但失败了。
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的含义,并建议我在运行时如何正确投射它吗?
谢谢
答案 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
方法。