2010-11-19 26 views
5

System.Net.Mime.MediaTypeNames.Imageのような静的クラスを拡張するために拡張メソッドや他の手法を使用できるかどうかは、私が必要とするタイプよりも少ないタイプです。静的クラスを拡張する拡張メソッド

+0

静的クラスを拡張することはできません。この質問の重複をSOで検索すると、いくつかの回避策が表示されます。 – BeemerGuy

+0

なぜあなたはそれを必要としますか?静的クラスにはコンテキストがなく、静的クラスの内部でできることは、コード内の他の場所で行うことができます。 –

+0

@Amby - 私はあなたが組織のプロポーザルのためだけにそれをしたいと思うかもしれないと思います。もちろん、静的なImageUtilityクラスを必要なメソッドで作成することができます(この答えによれば、彼は何とかやる必要があります)。しかしOPは彼が追加のクラスを必要としない方法でコードを整理したいと思います。残念ながら、あなたはできません。 (私は同じことをするためにここに来た)。 – MattW

答えて

6

いいえ、拡張メソッドは、静的メソッド(またはプロパティ)ではなくインスタンスメソッドを追加するためにのみ使用できます。拡張メソッドは、実際に静的メソッドのまわりの構文的な砂糖です。あなたは、このようなカウント()などの拡張メソッドを使用する場合たとえば、:

var list = GetList(); 
var size = list.Count(); 

これは、実際にコンパイルされます。

var list = GetList(); 
var size = Enumerable.Count(list); 

あなたが拡張メソッドを使用して、既存のクラスに追加の静的メソッドを追加することはできません。 。

+0

「拡張メソッドはインスタンスメソッドを追加するためにしか使用できません」と言うのは間違いですか?あなたが説明するように、彼らはインスタンスメソッドの外観を与えるだけです。実際にインスタンスメソッドではなく、クラスの非公開メンバーにアクセスできるようになります。 –

0

いいえ、これはC#ではまだ可能ではありませんが、うまくいけばそれはいつかなるでしょう。静的クラスはobjectから派生する必要があるため、静的クラスをサブクラス化して新しいメソッドを追加することはできません。あなたのコードに似たような効果をもたらす一つのことは、拡張メソッドが必要なときに代わりに使う静的クラスを宣言することだけです。例えば:

public static class MessageBox2 
{ 
    public static DialogResult ShowError(string Caption, string Message, params object[] OptionalFormatArgs) 
    { 
     return MessageBox.Show(string.Format(Message, OptionalFormatArgs), Caption, MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 

元のクラスが静的であるため、定義により「拡張」方法はthisパラメータとしてのインスタンスを受信する必要がなく、単に元のクラスの静的メソッドを使用することができます。