string []的扩展方法是小写所有元素?

时间:2012-08-11 18:27:46

标签: c# extension-methods static-methods

考虑以下方法示例:

public static string[] ParseOptions()
{
    return Environment.GetCommandLineArgs();
}

我需要做些什么来创建一个扩展,使ParseOptions()以小写形式返回所有命令行参数?

我希望能够按如下方式使用扩展名:

var argArray = ParseOptions().MyExtToLower();

注意:我要求此更好地了解如何为方法创建扩展。我真的不想以这种方式获得小写命令行参数。

4 个答案:

答案 0 :(得分:4)

public static string[] MyExtToLower(this string[] source)
{
    for (int i = 0; i < source.Length; i++)
    {
        source[i] = source[i].ToLower();
    }
    return source;    
}

请注意参数列表中的this关键字。这就是调用这样的方法的原因:

var argArray = ParseOptions().MyExtToLower();

要明确的是,您实际上并未在此处为方法添加扩展名。你正在做的是为方法返回的类型添加扩展名。

答案 1 :(得分:2)

您似乎在谈论Fluent Interfaces。看看这个例子 - http://blog.raffaeu.com/archive/2010/06/26/how-to-write-fluent-interface-with-c-and-lambda.aspx

或者,您可以对要返回的类型(在您的情况下为string[])创建扩展方法以获取方法链接 - http://msdn.microsoft.com/en-us/library/bb383977.aspx

答案 2 :(得分:1)

对于您描述的语法,您必须扩展String []或可能IEnumerable&lt; String&gt;以下方式:

public static class MyExtensions {

  public static String[] MyExtToLower(this String[] strings) {

    return strings.Select(s => s.toLower()).ToArray();

  }

  public static IEnumerable<String> MyExtToLower(this IEnumerable<String> strings) {

    return strings.Select(s => s.toLower());

  }

}

答案 3 :(得分:1)

您不创建方法的扩展,您可以创建扩展对象功能的方法。这些方法必须是静态的,并且是静态类的一部分。它们必须有一个标有this关键字的参数,以指示要扩展的对象。在您的情况下,您必须写下如下内容:

// the class must be static, I usually declare a class reserved for extension method.
// I mark it as partial so that I can put every method in the same file where I use it.
public static partial class Extension {
    // This is the extension method; it must be static. Note the 'this' keyword before
    // the first parameter: it tells the compiler extends the string[] type.
    public static MyExtToLower( this string[ ] args ) {
        // your code
    }
}

请注意,您无法覆盖实例方法。尽管如此,您可以使用与实例方法具有相同签名的方法,由于编译器绑定的方式,该方法永远不会被调用。