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拡張するオブジェクトを示すために、キーワードでマークされた1つのパラメーターが必要です。あなたの場合、あなたは次のようなものを書かなければなりません:

// 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 に答える