84 votes

Convertir Dictionary<string, object> en objet anonyme ?

Tout d'abord, pour plus de clarté, je vais expliquer mon scénario du début :

J'ai une méthode qui a la signature suivante :

public virtual void SendEmail(String from, List recepients, Object model)

Ce que je veux faire, c'est générer un objet anonyme qui a les propriétés de l'objet modèle ainsi que les deux premiers paramètres. Aplatir l'objet modèle en un PropertyInfo[] est très simple. En conséquence, j'ai pensé à créer un dictionnaire qui contiendrait les PropertyInfo et les deux premiers paramètres, puis à les convertir en objet anonyme où la clé est le nom de la propriété et la valeur est la valeur réelle de la propriété.

Est-ce possible ? D'autres suggestions ?

0 votes

Quelle est la raison pour laquelle vous voulez faire cela?

1 votes

Je doute que vous puissiez facilement prendre en charge un ensemble arbitraire de paires clé-valeur - vous devriez construire dynamiquement un nouveau type avec ces propriétés au moment de l'exécution. Étant donné que vous allez ensuite les lire, il serait préférable de créer une surcharge qui accepte également votre dictionnaire.

0 votes

@Rup: En fait, c'est aussi une alternative raisonnable. J'ai déjà trouvé un raccourci qui fonctionne bien pour mes besoins, mais j'aimerais quand même connaître la réponse à ma question ci-dessus... juste par curiosité :)

3voto

Mike Chaliy Points 8694

Les objets anonymes sont ceux générés pour vous par le compilateur. Vous ne pouvez pas en créer dynamiquement un. En revanche, vous pouvez émettre un tel objet, mais je ne pense vraiment pas que ce soit une bonne idée.

Peut-être pouvez-vous essayer les objets dynamiques? Le résultat sera un objet avec toutes les propriétés dont vous avez besoin.

1 votes

Oui, un objet dynamique serait parfait. Auriez-vous un exemple à fournir?

1 votes

Je ne pense pas que ce soit une déclaration précise, vous pouvez même créer de vrais types CLR à l'exécution. Je ne peux pas imaginer pourquoi vous ne pourriez pas créer un type anonyme à l'exécution.

3 votes

@ChrisMarisic citation de la réponse "vous pouvez émettre un tel objet". Bien sûr que vous le pouvez.

3voto

Jordan Points 340

Le crédit revient à la réponse acceptée. J'ai ajouté ceci car je voulais transformer une List> en List. Le but est d'extraire des enregistrements d'une table de base de données. Voici ce que j'ai fait.

    public static List ListDictionaryToListDynamic(List> dbRecords)
    {
        var eRecords = new List();
        foreach (var record in dbRecords)
        {
            var eRecord = new ExpandoObject() as IDictionary;
            foreach (var kvp in record)
            {
                eRecord.Add(kvp);
            }
            eRecords.Add(eRecord);
        }
        return eRecords;
    }

-1voto

Kibria Points 1206

Une version générique :

public static dynamic ToDynamic(this IDictionary source) where T : class
{
    var eo = new ExpandoObject() as IDictionary;
    foreach (var kvp in source)
    {
        eo.Add(kvp.Key, kvp.Value);
    }

    return eo;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X