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
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.
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
Vous devez vous connecter pour publier un commentaire.
Qu'en est explicitement coulée dans le dictionnaire de la valeur à
object
?En fait, un anonyme, un objet est une instance d'une compilation de façon aléatoire créé classe régulière, donc c'est un objet, mais il est de certains type particulier. C'est pourquoi vous ne peut pas s'attendre à un cast implicite de
IDictionary<string, object>
.Peut-être que si
IDictionary<TKey, TValue>
serait en charge de covarianteTValue
...C'est pourquoi j'ai dit "si il aurait eu...", je n'ai pas entré de la discussion à savoir si c'est possible ou pas...
J'ai reformulé la dernière phrase 😀
OriginalL'auteur Matías Fidemraizer
C'est une mauvaise pratique de travail avec les types anonymes comme vous l'avez fait. N'essayez pas de les envelopper comme un
object
. Si vous avez besoin des types anonymes, à l'utilisation, à la même méthode de contexte que vous voulez définir.Qu'en changeant simplement votre méthode:
Puis convertir l'objet en arrière dans une chaîne de caractères?
Bien sûr, c'est en supposant que vous ne pouvez pas modifier le type de
IDictionary<int, string>
parce que vous ne pouvez pas convertir l'objet en arrière pour le type anonyme. Vous serez peut-être obligé d'utiliser
dynamic
ou de réflexion pour obtenir les propriétés. Il est généralement préférable de créer des classes pour mettre vos valeurs.Dans votre cas, il sonne également légitime de créer un Produit supplémentaire de classe pour enregistrer les données
OriginalL'auteur Yonatan Nir