如何返回Dictionary <int,object =“”>?</int,>

时间:2014-12-04 18:04:37

标签: c# linq dictionary iqueryable anonymous-types

这有效:

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扩展方法的问题,但根据this answer,它应该可以工作,因为FindAll返回IQueryable<Product>

  

...如果您的数据来自IEnumerable或IQueryable来源,您可以   使用LINQ ToDictionary运算符获取一个并预测出   序列元素中所需的键和(匿名类型)值:

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

是什么给出了?

2 个答案:

答案 0 :(得分:6)

如何明确地将字典值转换为object

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

实际上,匿名对象是编译时随机创建的常规类的实例,因此它是一个对象,但它是某种特定类型。这就是无法期望隐式转换为IDictionary<string, object>

的原因

如果IDictionary<TKey, TValue>支持covariant TValue ...

,也许

答案 1 :(得分:4)

使用像你这样的匿名类型是一种不好的做法。不要尝试将它们包装为object。如果您需要匿名类型,请在您定义它们的相同方法上下文中使用它们。

如何更改方法:

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

然后将对象强制转换为字符串?

当然,假设您不能将类型更改为IDictionary<int, string>