【问题标题】:IDictionary AddAndReturn extension for fluent interface流畅界面的 IDictionary AddAndReturn 扩展
【发布时间】:2011-09-10 18:15:07
【问题描述】:

jQuery 是一个很棒的 JavaScript 库,它的好处在于能够将您正在处理的元素作为返回值。这是我所指的示例:

$(function() { 
    $("#poo").css("clear", "both").css("margin", "10px");
});

我想为 C# IDictionary interface 实现相同的功能,这样我就可以编写如下代码:

IDictionary<string, string> myDictionary = 
    new Dictionary<string, string>().
        Add("key1", "value1").
        Add("key2", "value2").
        Add("key3", "value3");

所以我为IDictionary创建了如下扩展方法:

public static IDictionary<string, string> AddAndReturn(this IDictionary<string, string> dictionary, string key, string value) {
    dictionary.Add(key, value);
    return dictionary;
}

现在我可以像这样使用它了:

IDictionary<string, string> poo = 
    new Dictionary<string,string>().
        AddAndReturn("key1", "value1").
        AddAndReturn("key2", "value2").
        AddAndReturn("key3", "value3");

我想知道我是否走在正确的道路上。

我正在做的是穷人的流畅接口实现还是完全无关?

在 C# 中是否有这种实现的已知案例?

【问题讨论】:

    标签: c# dictionary fluent-interface idictionary


    【解决方案1】:

    虽然您的实现模式是正确的(并且是一种常见的模式),但您的用例可能不是最佳选择。 Object 集合初始化器也适用于字典类型:

    var poo =  new Dictionary<string,string> {
            { "key1", "value1" },
            { "key2", "value2" },
            { "key3", "value3" }, // this is permissible
    };
    

    编译器神奇地将其转换为 Add(string, string) 调用。顺便说一句,最后一对之后明显错误的逗号是故意的。编译器允许这样做,因此您可以简化 T4 等代码生成器中的逻辑。

    【讨论】:

    • 快速术语:这些是集合初始化器。但是,是的,这是惯用的方法。
    • 由于C# I-don't-remember-which-version,可以使用特殊语法new Dictionary&lt;string, string&gt; { ["key"] = "value" }
    • 事实上,集合初始值设定项可用于具有名为Add()的(可能是扩展)方法的每种类型
    【解决方案2】:

    在 C# 中是否有这种实现的已知案例?

    关于这一点,我想补充一点,StringBuilder.Append() 方法返回的是StringBuilder,使得该方法可链接,例如:

    sb.Append("a").Append("b"). Append("c")
    

    但 .NET 中没有很多其他类似的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2022-08-19
      • 2014-09-21
      • 1970-01-01
      相关资源
      最近更新 更多