首页 > 解决方案 > 无法投射对象匿名通用列表

问题描述

如果您知道我将如何枚举对象列表,请告诉我。这是它的创建方式。由于某种原因,我无法将其转换为 List、IList、Enumerable、IEnumerable。我猜这是因为它是如何创建的(由第三方)。只是看看有没有人有任何想法。

错误如下:

Unable to cast object of type '<>f__AnonymousType5`1[System.Collections.Generic.List`1[SugarRest.Model.AMP_Product_Line]]' to type 'System.Collections.Generic.List`1[SugarRest.Model.AMP_Product_Line]'.

创建对象如下:

private static AMP_Contract CreateCrmContract(ContractDetailViewModel model, int bookmanContractNumber, int renewedFromContractNumber)
        {
            List<AMP_Product_Line> productLines = CreateProductLinesPrint(model, bookmanContractNumber);

            //Contract
            AMP_Contract ampContract = new AMP_Contract();

            ...

            ampContract.amp_amp_contracts_amp_amp_product_lines = new { productLines };

            return ampContract;
        }

public class AMP_Contract
    {              
        ...
        public object amp_amp_contracts_amp_amp_product_lines { get; set; }
        ...
    }

我试图访问/枚举的对象如下:

vc

在此处输入图像描述

我也试过这个,但是,有问题的对象是不可枚举的,因为它是一个对象。

在此处输入图像描述

标签: c#.netasp.net-mvccasting

解决方案


首先:编写此代码的人正在积极尝试阻止您访问该集合。您应该非常努力地考虑尝试击败他们的尝试是否正确;他们可能出于某种原因隐藏了这一点。

最简单的方法是使用 dynamic 从匿名类型中读取值。然后,您可以对所需的序列类型进行动态转换:

var contract = CreateCrmContract(...whatever...);
dynamic d = contract.amp_amp_contracts_amp_amp_product_lines;
IEnumerable<AMP_Product_Line> lines = d.productLines;

现在我们又回到了静态类型的世界:

foreach (AMP_Product_Line line in lines)
  Console.WriteLine(line);

推荐阅读