c# - 是否可以在 C# 中使用一组变量/动态字段声明匿名类型?

标签 c# dynamic anonymous-types dapper

在 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 上看到几个问题,询问关于在声明匿名类型后扩展(“扩展对象”),或在对象创建后声明任意字段的问题,但我没有需要这样做......我只需要预先动态声明一次类型。我怀疑如果可能的话,它需要一些奇思妙想。

我的理解是,编译器在编译时在后台为匿名类定义了一个类型,因此如果该类的字段在运行时才可用,我可能就不走运了。无论何时,我的用例实际上与使用“扩展对象”定义任意字段没有什么不同。

或者,如果有人知道将查询参数传递给 Dapper 的更好方法(而不是声明匿名类),我也很想听听。

谢谢!

更新

很抱歉延迟回到这个!这些回答都很棒,希望能给大家加分。我最终使用了 jbtule 的解决方案(由 Sam Saffron 编辑),将 IDynamicParameters 传递给 Dapper,所以我觉得我必须将答案交给他。其他回答也不错,回答了我提出的具体问题。我真的很感谢大家为此付出的时间!

最佳答案

Dapper 的创建者非常清楚这个问题。 INSERTUPDATE 助手确实需要这种功能。

QueryExecuteQueryMultiple 方法接受一个dynamic 参数。这可以是匿名类型、具体类型或实现 IDynamicParameters 的对象。

public interface IDynamicParameters
{
    void AddParameters(IDbCommand command, Identity identity);
}

这个接口(interface)非常方便,AddParameters 在运行任何 SQL 之前被调用。这不仅使您能够充分控制发送到 SQL 的参数。它允许您连接特定于数据库的 DbParameters,因为您可以访问该命令(您可以将其强制转换为特定于数据库的命令)。这允许支持表值参数等。

Dapper 包含此接口(interface)的实现,可用于您的目的,称为 DynamicParameters。这允许您连接匿名参数包并添加特定值。

您可以使用方法AddDynamicParams附加一个匿名类型。

var p = new DynamicParameters();
p.AddDynamicParams(new{a = "1"});
p.AddDynamicParams(new{b = "2", c = "3"});
p.Add("d", "4")
var r = cnn.Query("select @a a, @b b, @c c, @d d", p);
// r.a == 1, r.b == 2, r.c == 3, r.d == 4

关于c# - 是否可以在 C# 中使用一组变量/动态字段声明匿名类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7437043/

相关文章:

c# - 无法读取 Windows 8 中的注册表值

css - 具有绝对位置的div中的水平居中动态图像

linux - 如何在已编译的应用程序中替换 main()?

c# - 合并匿名类型

c# - C# For Access 2003 中的 UPDATE 命令参数 未更新

c# - 部分类中的自定义属性(无效的列名称)

c# - Razor Pages中如何处理input=file/IFormFile双向绑定(bind)

asp.net - 在标题后添加 Gridview 行

c# - 匿名类型可以继承自另一种类型吗?

c# - 为什么匿名类型在 C# 中是不可变的?