C# では、実行時までフィールドが不明な匿名型を宣言できるかどうかを調べたいと思います。
たとえば、キーと値のペアのリストがある場合、そのリストの内容に基づいて匿名型を宣言できますか? 私が取り組んでいる特定のケースは、パラメーターを Dapper に渡すことです。この場合、事前にパラメーターの数がわかりません。
List<Tuple<string, string>> paramList = new List<Tuple<string, string>>() {
new Tuple<string, string>("key1", "value1"),
new Tuple<string, string>("key2", "value2")
...
};
この List (または同等の Map) を、クエリ パラメータとして Dapper に渡すことができる匿名型に変換したいと考えています。したがって、理想的には、匿名型として定義されている場合、上記のリストは次のようになります。
new { key1=value1, key2=value2, ... }
StackOverflow で、宣言された後に匿名型を拡張すること (「extendo オブジェクト」)、またはオブジェクトの作成後に任意のフィールドを宣言することについて尋ねる質問をいくつか見てきましたが、それを行う必要はありません...必要なだけです型を事前に動的に宣言します。私の疑いでは、それが可能であるとしても、それにはいくらかの凝った反省が必要になるだろう.
私の理解では、コンパイラはコンパイル時にボンネットの下で匿名クラスの型を定義するため、そのクラスのフィールドが実行時まで利用できない場合、運が悪い可能性があります。私の使用例は、「拡張オブジェクト」を使用して任意のフィールドをいつでも定義することと実際には変わらないかもしれません。
または、(匿名クラスを宣言するのではなく) クエリ パラメーターを Dapper に渡すためのより良い方法を誰かが知っている場合は、それについても聞きたいです。
ありがとう!
アップデート
こちらからの連絡が遅くなり申し訳ありません!これらの回答はすべて素晴らしいものでした。皆さんにポイントを与えたいと思います。jbtule のソリューション (Sam Saffron による編集) を使用して IDynamicParameters を Dapper に渡すことになったので、彼に答えを与える必要があると感じました。他の回答も素晴らしく、私が尋ねた具体的な質問に答えてくれました。みんなの時間を本当にありがとう!