Как создать анонимный объект с именами свойств, определяемыми динамически?

Учитывая массив значений, я хотел бы создать анонимный объект со свойствами, основанными на этих значениях.Имена свойств будут просто «pN» , где N - это индекс значения в массиве.

Например, задано

object [] values ​​= {123, "foo"};

я хотел бы создать анонимный объект

new {p0 = 123, p1 = "foo"};

Единственный способ, который я могу придумать для этого, - это использовать переключатель или , если объединяет в цепочку до разумного числа поддерживаемых параметров, но мне было интересно, был более элегантный способ сделать это:

object[] parameterValues = new object[] { 123, "foo" };
dynamic values = null;

switch (parameterValues.Length)
{
    case 1:
        values = new { p0 = parameterValues[0] };
        break;
    case 2:
        values = new { p0 = parameterValues[0], p1 = parameterValues[1] };      
        break;
    // etc. up to a reasonable # of parameters
}

Предпосылки

У меня есть существующий набор методов, которые выполняют инструкции sql для базы данных. Обычно методы принимают строку для оператора sql и объект params [] для параметров, если таковые имеются. Подразумевается, что если в запросе используются параметры, они будут называться @ p0, @ p1, @ p2 и т. Д. .

Пример:

public int ExecuteNonQuery(string commandText, CommandType commandType, params object[] parameterValues) { .... }

, который будет называться следующим образом:

db.ExecuteNonQuery("insert into MyTable(Col1, Col2) values (@p0, @p1)", CommandType.Text, 123, "foo");

Теперь я хотел бы использовать Dapper в этом классе, чтобы обернуть и раскрыть метод Dapper Query , и сделать это таким образом, чтобы это соответствовало существующим методам, например что-то вроде:

public IEnumerable ExecuteQuery(string commandText, CommandType commandType, params object[] parameterValues) { .... }

но метод Dapper Query принимает значения параметров в анонимном объекте:

var dog = connection.Query("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid }); 

, что приводит к моему вопросу о создании анонимного объекта для передачи параметров в Dapper.


Добавление кода с использованием класса DynamicParameter по запросу @Paolo Tedesco.

string sql = "select * from Account where Id = @p0 and username = @p1";
dynamic values = new DynamicParameter(123, "test");
var accounts = SqlMapper.Query(connection, sql, values);

вызывает исключение в строке 581 SqlMapper Dapper.cs файл:

using (var reader = cmd.ExecuteReader())

, исключение составляет SqlException :

Необходимо объявить скалярную переменную «@ p0».

и проверка свойства cmd.Parameters не показывают параметров, настроенных для команды.

16
задан Jeff Ogata 14 December 2011 в 16:56
поделиться