【问题标题】:How did they implement this syntax in the Massive Micro-ORM, multiple args parameters?他们是如何在 Massive Micro-ORM、多个 args 参数中实现这种语法的?
【发布时间】:2011-09-02 23:50:01
【问题描述】:

在此页面上,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);

但我得到的只是:

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

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

我在这里错过了什么?

【问题讨论】:

    标签: c#-4.0 named-parameters massive


    【解决方案1】:

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

     Test(age: 40, name: "Lasse", args: new object[] { 10, 25 });
    

    【讨论】:

    • 说得有道理,也许我应该回到他的博客去问问那里……也许​​那是开始的正确方法,哦,好吧。我会推迟接受这个答案,看看是否有办法(尽管我对此表示怀疑)。
    • 嗯,我是从 Rob 的博客中复制的。对此感到抱歉。
    【解决方案2】:

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

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

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

    现在,要在 C# 4.0 中调用此方法,您可以使用 "MyMethod(arg1: "Lasse", args:1,2,4,5)"

    【讨论】:

    • 确定我可以使用args:1,2,4,5 调用它吗?我无法编译它。我只能编译:args: new[] { 1,2,4,5 }。为了清楚起见,我不是询问args: 部分,我完全了解C# 4.0 中的命名参数是如何工作的,特别是我询问的是1,2,4,5 部分。
    • 嗯 - 我确定,然后我不确定。这很奇怪——如果你只将一个参数传递给 args:,那么它会起作用。如果您传入多个,那么我会得到与您相同的错误。斯基特!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多