2

現在、通常の機能を -function に置き換える拡張機能を作成string.FormatしていFormatNamedます。

ここまでのコードですが、パラメータの入力方法を変更したい

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 に答える