1

メソッドを任意のインスタンスに拡張するのは非常に簡単です。

public static string LeaveJustNumbers(this string text)
{
    return Regex.Replace(text, @"[\D]", "");
}
...
string JustNumbers = "A5gfb343j4".LeaveJustNumber();

しかし、メソッドを文字列のような封印されたクラスに拡張して、次のように動作させたい場合はどうすればよいでしょうか:

string.Format("Hi:{0}","Fraga");

それを行う方法はありますか?

4

1 に答える 1

4

静的メソッドの「拡張」(または既存のメソッドの置き換え) について話している場合、私の知る限り、それはできません。なぜそうしたいのかわかりません。

拡張メソッドの主なポイントは、呼び出しスタイルがインスタンスのメソッド呼び出しのスタイルになるようにすることです。とりわけ、より洗練された構文とメソッドの連鎖が可能になります。たとえば、拡張メソッドのない LINQ は非常に苦痛です。

3 つのオプションがありますが、そのうちの 1 つは非常に恐ろしいものです。

静的メソッドで呼び出しを行う通常の拡張メソッドを作成します

public static string SomeExtensionMethod(this string name) 
{
    return string.Format("Hi:{0}", name);
}

使用法:

Console.WriteLine("Mr Smith".SomeExtensionMethod());

静的ヘルパー クラスを作成し、それを使用して呼び出しを行う

 Console.WriteLine(MyHelperClass.SomeMethod("Mr Smith"));

そして、邪悪なもの

「拡張」したいタイプと同じ名前の静的ヘルパー クラスを作成します (例: public class String)。次に、静的ターゲット メソッドのシグネチャ (Format) を複製し、 「システム」名前空間からではない「文字列」という名前の型であり、String=MyCrazyHacks.String および/または明示的な名前空間を使用して .cs ファイルを細かくする必要があります。

System.String のエイリアスであるため、「string」にこれを実行できるかどうかさえわからないため、代わりに「String」という名前を使用するように例を変更しました。

namespace MyCrazyHacks
{
    public static class String
    {
        public static System.String Format(
         System.String str, params object[] zeParams)
        {
            // do bad, unspeakable things that confuses everyone
            return System.String.Format(....); 
        }
    }
}

注: 多大な苦痛を与えるため、これを行わないでください...

于 2010-05-02T01:58:12.853 に答える