在 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 objects”)的问题,或者在创建对象后在对象上声明任意字段,但我不需要这样做......我只需要预先动态声明类型一次。我的怀疑是,如果可能的话,这将需要一些花哨的反思。
我的理解是编译器在编译时为匿名类定义了一个类型,所以如果该类的字段直到运行时才可用,我可能会不走运。实际上,我的用例实际上可能与使用“扩展对象”来定义任意字段没有什么不同。
或者,如果有人知道将查询参数传递给 Dapper 的更好方法(而不是声明一个匿名类),我也很想听听。
谢谢!
更新
很抱歉延迟回到这个!这些答案都很棒,希望能给大家加分。我最终使用了 jbtule 的解决方案(由 Sam Saffron 编辑),将 IDynamicParameters 传递给 Dapper,所以我觉得我必须给他答案。其他答案也很好,回答了我提出的具体问题。我真的很感谢大家在这方面的时间!