В C # я хотел бы выяснить, возможно ли объявить анонимный тип, где поля неизвестны до времени выполнения.
Например, если у меня есть список пар ключ / значение, могу ли я объявить анонимный тип на основе содержимого этого списка? Конкретный случай, с которым я работаю, это передача параметров в Dapper, где я заранее не знаю, сколько у меня будет параметров.
List<Tuple<string, string>> paramList = new List<Tuple<string, string>>() {
new Tuple<string, string>("key1", "value1"),
new Tuple<string, string>("key2", "value2")
...
};
Я хотел бы преобразовать этот Список (или эквивалентную Карту) в анонимный тип, который я могу передать в Dapper в качестве параметров запроса. Поэтому в идеале приведенный выше список должен выглядеть примерно так, если его определить как анонимный тип:
new { key1=value1, key2=value2, ... }
Я видел несколько вопросов о StackOverflow, спрашивающих о расширении анонимных типов после того, как они объявлены ("объекты расширения"), или объявлении произвольных полей в объекте после его создания, но мне не нужно чтобы сделать это ... Мне просто нужно объявить типы динамически заранее. Я подозреваю, что это потребует некоторой фантазии, если это вообще возможно.
Насколько я понимаю, компилятор определяет тип для анонимных классов под капотом во время компиляции, поэтому, если поля этого класса недоступны до времени выполнения, мне может не повезти. Мой сценарий использования на самом деле может не отличаться в действительности от использования «объекта exteo» для определения произвольных полей, в любое время.
В качестве альтернативы, если кто-то знает о лучшем способе передачи параметров запроса в Dapper (вместо объявления анонимного класса), я также хотел бы услышать об этом.
Спасибо!
UPDATE
Извините за задержку с возвращением к этому! Все эти ответы были великолепны, я хотел бы дать очки всем. В итоге я использовал решение jbtule (с редактором Сэмом Саффроном), передав IDynamicParameters Dapper, поэтому я чувствовал, что должен дать ему ответ. Другие ответы тоже были хорошими и отвечали на конкретные вопросы, которые я задавал. Я действительно ценю время каждого на этом!