Est-il possible de déclarer un type anonyme en C # avec un ensemble de champs variable / dynamique?

En C#, je voudrais savoir si il est possible de déclarer un type anonyme où les champs ne sont connus qu'au moment de l'exécution.

Par exemple, si j'ai une Liste de paires clé/valeur, puis-je déclarer un type anonyme basé sur le contenu de cette liste? Le cas spécifique, je travaille avec passage de paramètres à Dapper, où je ne sais pas à l'avance combien de paramètres, je vais avoir.

List<Tuple<string, string>> paramList = new List<Tuple<string, string>>() {
    new Tuple<string, string>("key1", "value1"),
    new Tuple<string, string>("key2", "value2")
    ...
};

Je voudrais convertir cette Liste (ou un équivalent de la Carte) dans un type anonyme que je peux passer à Dapper, comme les paramètres de la requête. Donc, idéalement, la liste ci-dessus liquidation à la recherche de ce genre, si elle est définie comme un type anonyme:

new { key1=value1, key2=value2, ... }

J'ai vu plusieurs questions sur StackOverflow de demander à propos de l'extension de les types anonymes après qu'ils ont été déclarés ("extendo objets"), ou la déclaration d'arbitraire champs d'un objet après sa création, mais je n'ai pas besoin de le faire... j'ai juste besoin de déclarer les types de manière dynamique à l'avant une fois. Mon soupçon est qu'il faudra un peu de fantaisie à la réflexion, si c'est possible.

Ma compréhension est que le compilateur définit un type anonyme pour les classes de sous le capot à la compilation, donc les champs de cette classe ne sont pas disponibles jusqu'à ce moment de l'exécution, je suis peut-être hors de la chance. Mon cas d'utilisation peut en effet pas être différent en réalité que d'utiliser un "extendo objet" de définir arbitraire des champs, à chaque fois.

Sinon, si quelqu'un connaît une meilleure façon de passer les paramètres de requête de Dapper (plutôt que de déclarer une classe anonyme), j'aimerais entendre à ce sujet ainsi.

Merci!

Mise à JOUR

Désolé pour le retard dans le retour à celui-ci! Ces réponses ont été de tous les grands, je souhaite que je pourrais donner des points à tout le monde. J'ai fini par utiliser jbtule de la solution (à modifier par Sam Safran), en passant IDynamicParameters à Dapper, donc j'ai senti que j'avais à donner une réponse à lui. Les autres réponses ont également été bonne, et a répondu à certaines questions que j'avais posées. J'apprécie vraiment tout le monde de temps en temps sur ce!

source d'informationauteur Egahn