C#字符串插值 - 是否可以反映内部中间结构?

时间:2015-07-03 07:47:15

标签: c# c#-6.0

最近一直在使用Dapper,所以当然有很多代码如:

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}"

然而。这只适用于普通字符串,不需要任何参数知识,转义等等。是否可能以某种方式反映编译器生成的中间结构,然后使用它来正确设置参数?因此,不是产生的字符串,而是可以获得包含带有孔的字符串和对象数组的东西。对我来说,用这些数据可以做很多事情。

1 个答案:

答案 0 :(得分: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;
    }
}