C# 如何归还词典<;int,object>;?

C# 如何归还词典<;int,object>;?,c#,linq,dictionary,iqueryable,anonymous-types,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 = "W

这项工作:

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

给出了什么?

如何明确地将字典值强制转换为
对象

return products.ToDictionary( p => p.Id, p => (object)new { Description = p.Description } )
实际上,匿名对象是编译时随机创建的常规类的实例,因此它是一个对象,但它属于某种特定类型。这就是为什么不能期望对
IDictionary
进行隐式转换的原因


如果
IDictionary
支持
TValue

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

改变你的方法怎么样:

public IDictionary<int, object> GetProducts( int departmentID )
{
    return new Dictionary<int, object>
                {
                    { 1, "Something"},
                    { 2, "Whatever"},
                };
}
公共IDictionary GetProducts(int部门ID)
{
返回新词典
{
{1,“某物”},
{2,“随便”},
};
}
然后将对象转换回字符串


当然,这是假设您不能仅仅将类型更改为
IDictionary

,该值实际上需要几个属性(不仅仅是描述),例如价格、名称、颜色等。为了简化,我在示例中只包含了一个属性。为什么这是一种不好的做法?@Koveras,因为您无法将对象强制转换回匿名类型。您将被迫使用
动态
或反射来获取属性。通常最好创建类来将值放入其中。@koferas在您的情况下,创建额外的产品类来保存数据听起来也是合法的。您能澄清您的协变注释吗?我不确定这将如何解决这个问题。@DStanley这就是为什么我说“如果它会……”,我还没有参与讨论它是否可能……@DStanley我已经重新表述了最后一句话:DBe意识到,你必须将价值投射到object之外的东西上,才能用它做任何有用的事情。由于实际值是匿名类型,您需要求助于反射或
动态
,两者都不是编译时安全的。最好创建一个具体的类并将其用作结果值类型。仅仅为了序列化JSON而创建一个模型对我来说似乎是多余的。
Cannot convert expression type 'System.Collections.Generic.Dictionary<int,{Description:string}>' to return type 'System.Collections.Generic.IDictionary<int,object>'
var intToAnon = sourceSequence.ToDictionary(
    e => e.Id,
    e => new { e.Column, e.Localized });
return products.ToDictionary( p => p.Id, p => (object)new { Description = p.Description } )
public IDictionary<int, object> GetProducts( int departmentID )
{
    return new Dictionary<int, object>
                {
                    { 1, "Something"},
                    { 2, "Whatever"},
                };
}