2

我目前正在编写一个扩展,用我的-function替换正常。string.FormatFormatNamed

到目前为止我已经得到了这段代码,但是我想改变输入参数的方式

void Main()
{
    string sql = "SELECT {fields} FROM {table} WHERE {query}"
        .FormatNamed(new { fields = "test", table = "testTable", query = "1 = 1" });
    Console.WriteLine(sql);
}

public static class StringExtensions
{
    public static string FormatNamed(this string formatString, dynamic parameters)
    {
        var t = parameters.GetType();
        var tmpVal = formatString;
        foreach(var p in t.GetProperties())
        {
            tmpVal = tmpVal.Replace("{" + p.Name + "}", p.GetValue(parameters));
        }
        return tmpVal;
    }
}

不是最漂亮的替代品,但它可以完成工作。

反正。我想改变,所以我可以用

.FormatName(field: "test", table: "testTable", query: "1 = 1");

有什么办法可以做到这一点吗?我试过用谷歌搜索动态命名参数,但没有很好的结果。

4

2 回答 2

5

您将无法指定任意数量的动态命名参数。这不是 C# 支持的东西。您现有的代码对我来说似乎没问题,尽管我认为不需要该dynamic参数。这也可以:

public static string FormatNamed(this string formatString, object parameters)
{
    var t = parameters.GetType();
    var tmpVal = formatString;
    foreach(var p in t.GetProperties())
    {
        tmpVal = tmpVal.Replace("{" + p.Name + "}", p.GetValue(parameters));
    }
    return tmpVal;
}

然后将其称为:

string sql = "SELECT {fields} FROM {table} WHERE {query}"
    .FormatNamed(new { fields = "test", table = "testTable", query = "1 = 1" });

虽然我真的不建议使用这种方法来构建 SQL(它根本不会使您免受SQL 注入攻击),但该方法本身是合理的。

于 2013-08-12T13:59:07.067 回答
2

我试过用谷歌搜索动态命名参数,但没有好的结果

那是因为能力不存在。想一想 - 如果在编译时不知道参数及其名称,函数如何知道该怎么做?我能想到的最接近的方法是使用params它为您提供一个值数组,但它们必须都是相同的类型,您仍然可以通过给定的名称(和索引值)访问它们。

我会坚持你目前使用的方法:

.FormatName(new {field = "test", table = "testTable", query = "1 = 1"});

这将创建一个具有指定属性的匿名类型,它应该适用于您现有的代码。另外,只需输入几个额外的字符。

另请注意,dynamic这里不会给您买任何东西,因为它用于直接访问属性而不使用反射。由于您使用反射来获取您可以使用的属性object

于 2013-08-12T13:59:54.760 回答