2015-07-03 2 views
0

Использую щеголеватый в последнее время, так что, конечно, есть много кода, как:C# строка интерполяция - возможно ли отразить внутреннюю промежуточную структуру?

var id = 123; 
var s = "hola"; 
conn.Execute("update foo set bar = @a where id = @b", new { a = s, b = id }) 

Это был также мой первый раз с C# 6.0, так что я заметил сходство между выше и интерполяции строк:

$"update foo set bar = {s} where id = {id}" 

Однако. это просто работает на простых строках, без каких-либо знаний о параметрах, побегах и т. д. Было бы возможно каким-то образом задуматься о промежуточной структуре, сгенерированной компилятором, а затем использовать ее для правильной настройки параметров? Таким образом, вместо результирующей строки можно получить что-то, что содержит строку с отверстиями и массив объектов. Чувствует, что с такими данными можно было бы многое сделать.

+2

* Будет ли это быть как-то можно подумать о промежуточной структуре, генерируемого компилятором, а затем использовать его, чтобы правильно настроить параметры * Я не понять, что вы имеете в виду здесь ... – xanatos

+0

И когда вы хотели бы сделать этот анализ? Во время компиляции (сразу после компиляции)? Во время выполнения? – xanatos

+0

Во время выполнения. В двух словах, вместо того, чтобы получать готовые строки из такой интерполяции, я хотел бы получить этот компилятор структуры, чтобы преобразовать его в (если я прав) string.Format calls: строка с отверстиями и массив объектов. Мне кажется, это может быть очень полезно – Bartosz

ответ

3

Попробуйте что-то вроде этого:

public static class DbExtensions 
{ 
    public static IDbCommand CreateCommand(this IDbConnection connection, FormattableString commandText) 
    { 
     var command = connection.CreateCommand(); 
     command.CommandType = CommandType.Text; 

     if (commandText.ArgumentCount > 0) 
     { 
      var commandTextArguments = new string[commandText.ArgumentCount]; 
      for (var i = 0; i < commandText.ArgumentCount; i++) 
      { 
       commandTextArguments[i] = "@p" + i.ToString(); 
       command.AddParameter(commandTextArguments[i], commandText.GetArgument(i)); 
      } 

      command.CommandText = string.Format(CultureInfo.InvariantCulture, commandText.Format, commandTextArguments); 
     } 
     else 
     { 
      command.CommandText = commandText.Format; 
     } 

     return command; 
    } 
} 
+0

Но мой вопрос был в том, как получить FormattableString. Но ваш фрагмент помог мне больше узнать о Google, и я нашел это: https://gist.github.com/svick/e5b30f73146a501cc64f. Он делает именно то, что я хотел, хорошо! – Bartosz

Смежные вопросы