Comment puis-je retourner un Dictionnaire<int, object>?

Cela fonctionne:

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

Mais pour certaines raisons, ce n'est pas le cas:

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 } );
}

Cela ne fonctionne pas non plus:

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 } );
}

L'erreur de compilation (dans les deux cas) est:

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

J'ai supposé que c'était un problème avec la ToDictionary extension Linq méthode, mais selon cette réponse il devrait fonctionner depuis FindAll retourne un IQueryable<Product>:

... si vos données sont à venir à partir d'un IEnumerable IQueryable source, vous pouvez
obtenir une aide de LINQ ToDictionary de l'opérateur et de la projection sur le
clé requise et (de façon anonyme tapé) la valeur de la séquence d'éléments:

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

Ce qui donne?

Soyez conscient que vous aurez à convertir la valeur en autre chose que de l'objet pour en faire quelque chose d'utile. Depuis, la valeur réelle est un type anonyme, vous aurez besoin de recourir à la réflexion ou dynamic, ce qui n'est pas au moment de la compilation coffre-fort. Vous feriez mieux de la création d'un béton de classe et à l'aide de que que le type de la valeur.
Ainsi, la valeur de retour est sérialisé en JSON, qui est très utile. La création d'un modèle juste pour le but de la sérialisation JSON semble redondant pour moi.
Vrai - qu'est valide d'utilisation.

OriginalL'auteur David Kennedy | 2014-12-04