将IList <t1>转换为ILIst <t2>

时间:2018-05-23 10:02:22

标签: c# list linq oop casting

尝试像这样投射

Products1 = (IList<ProductInfo>)basicProfile.Products2.Select(ToProductInfo)

产品1是

public IList<ProductInfo> Products { get; set; }

产品2是

public IList<Product> Products { get; }

以下是我在Product2的每个元素上应用的方法

internal static ProductInfo ToProductInfo(Product product)
    {
        if (product == null)
        {
            return null;
        }

        return new ProductInfo
        {
            Id = product.Id,
            EffectiveTimestamp = product.EffectiveTimestamp,
            ExpiryTimestamp = product.ExpiryTimestamp
        };
    }

产品和ProductInfo具有相同的结构并且几乎相同

我正在抓住这个

System.InvalidCastException : Unable to cast object of type 
'SelectArrayIterator`2[Domain.Product,WebApi.Contracts.ProductInfo]' to type 
'System.Collections.Generic.IList`1[WebApi.Contracts.ProductInfo]'.

更不用说它甚至没有进入ToProductInfo方法

1 个答案:

答案 0 :(得分:5)

由于linq的工作方式(延迟执行)选择,创建一个IEnumerable

您想要实现的目标可以通过添加ToList()

来完成
Products1 = basicProfile.Products2.Select(ToProductInfo).ToList()

或根据您的使用情况,将Products1定义为

public IEnumerable<ProductInfo> Products { get; set; }

了解更多信息,请访问此页面 https://msdn.microsoft.com/en-us/library/bb308959.aspx以及延期查询评估部分

这允许您链接linq查询而无需多次迭代您的集合