【问题标题】:Named/Optional parameters in C# 3.0?C# 3.0 中的命名/可选参数?
【发布时间】:2009-03-08 01:42:01
【问题描述】:

有没有办法像 C# 4.0 一样向 C# 3.0 添加可选参数?我得有这个功能,我等不及了!

编辑:

如果您知道实现此目的的解决方法/技巧,请将其发布。谢谢!

【问题讨论】:

    标签: c# c#-3.0 c#-4.0


    【解决方案1】:

    您可以使用匿名类型和反射作为命名参数的解决方法:

    public void Foo<T>(T parameters)
    {
        var dict = typeof(T).GetProperties()
            .ToDictionary(p => p.Name, 
                p => p.GetValue(parameters, null));
    
        if (dict.ContainsKey("Message"))
        {
            Console.WriteLine(dict["Message"]);
        }
    }
    

    所以现在我可以这样调用 Foo:

    Foo(new { Message = "Hello World" });
    

    ...它会写下我的信息。

    基本上,我从传递的匿名类型中提取所有属性,并将它们转换为字符串和对象的字典(属性的名称及其值)。

    【讨论】:

    • 我看不到自己实际使用过它,但它非常聪明。当然,您可以使用非匿名类型来避免反射开销。
    • 我将确保在周一回去工作之前仔细考虑所有可以用它完成的很酷的事情。非常聪明!
    【解决方案2】:

    总是有方法重载。 :)

    【讨论】:

      【解决方案3】:

      很遗憾,没有。您将需要 C# 4.0 编译器来支持这一点。如果你今天想要.NET平台上的可选参数,你可以试试VB .NET或F#。

      【讨论】:

        【解决方案4】:

        正如 Dustin 所说,可选参数将出现在 C# 4.0 中。一种模拟可选参数的糟糕方法是将 object[](或更强类型的数组)作为最后一个参数。

        【讨论】:

        • 在最后一个 object[] 参数前面使用 'params' 关键字,这样你也得到了更容易调用的东西。
        【解决方案5】:

        也可以使用可变参数作为选项参数。其工作方式的一个示例是 string.Format()。

        看这里:

        http://blogs.msdn.com/csharpfaq/archive/2004/05/13/131493.aspx

        【讨论】:

          猜你喜欢
          • 2010-10-27
          • 2010-12-09
          • 1970-01-01
          • 1970-01-01
          • 2010-12-15
          • 2011-10-28
          • 1970-01-01
          • 2011-03-04
          • 2019-04-14
          相关资源
          最近更新 更多