c#如何才能将返回的一本字典?

标签: Linq C#
发布时间: 2017/2/28 21:42:37
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

此作品︰

public IDictionary<int, object> GetProducts( int departmentID )
{
    return new Dictionary<int, object>
                {
                    { 1, new { Description = "Something" } },
                    { 2, new { Description = "Whatever" } },
                };
}

但由于某种原因,这不会︰

public IDictionary<int, object> GetProducts( int departmentID )
{
    var products = ProductRepository.FindAll( p => p.Department.Id == departmentID );

    return products.ToDictionary( p => p.Id, p => new { Description = p.Description } );
}

这也不起作用︰

public IDictionary<int, object> GetProducts( int departmentID )
{
    var products = ProductRepository.FindAll( p => p.Department.Id == departmentID );

    return products.ToDictionary( p => p.Id, p => new { p.Description } );
}

编译器错误 (在这两种情况下) 是︰

Cannot convert expression type 'System.Collections.Generic.Dictionary<int,{Description:string}>' to return type 'System.Collections.Generic.IDictionary<int,object>'

我假设这是一个问题与 ToDictionary Linq 扩展方法,但这个答案它应该工作因为 FindAll 返回 IQueryable<Product> :

......如果您的数据来自 IEnumerable 或 IQueryable 的源,你可以使用 LINQ ToDictionary 运算符和投射出所需关键和 (匿名类型) 的价值,从序列元素︰

var intToAnon = sourceSequence.ToDictionary(
    e => e.Id,
    e => new { e.Column, e.Localized });

谁给了?

解决方法 1:

什么关于铸造字典的显式值到 object

return products.ToDictionary( p => p.Id, p => (object)new { Description = p.Description } )

实际上,匿名对象是编译时随机创建常规类的一个实例,因此它是一个对象,但它是某种特定类型。这就是为什么你不能指望隐式强制转换到 IDictionary<string, object>

也许如果 IDictionary<TKey, TValue> 将支持协变 TValue ...

官方微信
官方QQ群
31647020