6

在此页面上,Scott Hanselman展示了 Micro-ORMs Dapper 和 Massive 的两个示例,Massive-example 引起了我的兴趣,因为我看不出他们如何实现该语法。

示例如下,我将把它分成几行而不是一长行:

var tbl = new Products();
var products = tbl.All(where: "CategoryID = @0 AND UnitPrice > @1",
    orderBy: "ProductName", limit: 20, args: 5,20);
                                       ^----+---^
                                            |
                                            +-- this

他们是如何实现这种语法的,允许args有多个值?我假设params基于 - 的参数,因为这是唯一允许这样做的事情,但我不明白他们如何构造允许这样做的方法,因为在我看来,我所有的尝试最终都会抱怨命名参数并修复位置参数的顺序错误。

我尝试了这样的测试方法:

public static void Test(string name, int age, params object[] args)
{
}

然后使用命名参数:

Test(age: 40, name: "Lasse", args: 10, 25);

但我得到的只是:

命名参数规范必须出现在所有固定参数指定之后

所以显然这是错误的。此外,我在源代码中看不到任何允许这样做的东西,但也许我找错了地方。

我在这里想念什么?

4

2 回答 2

8

其实我认为Hanselman先生展示了一些无法编译的代码(哎呀,我真的敢这么说吗?)。只能让它像这样工作:

 Test(age: 40, name: "Lasse", args: new object[] { 10, 25 });
于 2011-05-27T12:06:22.587 回答
2

这只是 C# 4.0 中的命名参数。您可以使用上面调用中看到的参数名称来指定参数。

要接受一个数组(如您所见的多个“args”) - 您只需使用“params”关键字:

public void MyMethod(string arg1, params object[] args){ //.. }

Now, to call this method in C# 4.0, you could use "MyMethod(arg1: "Lasse", args:1,2,4,5)"

于 2011-06-30T21:23:54.210 回答