7

プロトタイプが次のような関数があります。 public void doThings(string sql, dynamic dParams);

これらのパラメーターを使用して、ある種の SQL クエリを実行します。私はそれを書いていませんが、私はそれを使用する必要があります。次のようなことをするとうまくいきます:

doThings("select * from SomeTable where myval1=@v1 and myval2=@v2",
        new
        {
            v1 = new Dapper.DbString()
            {
                Value = "yay",
                IsAnsi = true,
                Length = 50
            },
            v2 = new Dapper.DbString()
            {
                Value = "really",
                IsAnsi = true,
                Length = 32
            }
        });

しかし、動的パラメーターを ExpandoObject に最初に入れたときではありません。

dynamic dynParams = new ExpandoObject();
dynParams.v1 = new Dapper.DbString()
    {
        Value = "yay",
        IsAnsi = true,
        Length = 50
    }
doThings("query here", dynParams);  

その後、クエリは結果を返しません。などのクエリを実行する可能性のある 10 の異なるシナリオで、そのブロックを 10 回呼び出しdoThings()て書き込みたくありません。を渡す必要がある特別な方法、または一般的にこれを行う必要がある他の方法はありますか?newmyval2myval3ExpandoObject

4

3 に答える 3

1

doThings次のように書くと、リフレクションを使用して必要な値を取得しているように見えます。

new { 
    v1 = 1,
    v2 = "foo"
}

と の 2 つのプロパティv1を使用して型を作成していますv2が、を使用している場合は、に新しいプロパティを追加しません(すべての魔法の動作は、コンパイラによって生成されたものです)。ExpandoObjectExpandoObject

doThingコンパイル時にわかっているプロパティで使いたいのであれば問題ないことは理解しています。実行時にプロパティがわかっている場合、私が考えることができる唯一の方法は、を使用して実行時に必要な匿名型を生成することですReflection.Emitこの記事を見てください。

于 2013-09-24T19:00:39.003 に答える