这有效:
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 });
是什么给出了?
答案 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>