0

考虑以下方法示例:

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

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

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

var argArray = ParseOptions().MyExtToLower();

注意:我问这个是为了更好地理解如何为方法创建扩展。我实际上对以这种方式获取小写命令行参数并不感兴趣。

4

4 回答 4

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();

需要明确的是,您实际上并没有在此处向方法添加扩展。您正在做的是向方法返回的类型添加扩展。

于 2012-08-11T18:31:07.827 回答
2

您似乎在谈论流畅的接口。看看这个例子 - 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

于 2012-08-11T18:30:54.610 回答
1

对于您描述的语法,您必须通过以下方式扩展 String[] 或可能 IEnumerable<String> :

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());

  }

}
于 2012-08-11T18:35:18.227 回答
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
    }
}

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

于 2012-08-11T18:41:11.993 回答