2009-05-15 26 views
131

可能性の重複:
Can I add extension methods to an existing static class?静的拡張メソッド

私はクラスに静的な拡張メソッドを追加することができますどのような方法があります。

具体的には、int引数を許可するためにBoolean.Parseをオーバーロードします。

+7

どのようにこれをすることができように使用

public static class IntExtensions { public static bool Parse(this int value) { if (value == 0) { return true; } else { return false; } } public static bool? Parse2(this int value) { if (value == 0) { return true; } if (value == 1) { return false; } return null; } } 

をintに拡張メソッドを追加することができます重複?これは、ブールのようなインスタンスを持つことができるクラスに静的(クラス)メソッドのように動作する拡張メソッドを追加したいのですが、他の質問は静的クラスに拡張メソッドを追加する方法を尋ねます –

+1

C# "WPF構文との互換性を達成するためにSilverlightで使用できるように、" Public static DependencyProperty(静的DependencyProperty x、文字列名、Typeプロパティタイプ、タイプownerType、FrameworkPropertyMetadata typeMetadata)を登録します(Dr.WPFの値強制の実装を包むDependencyPropertyの場合)。 "this DependencyProperty"の代わりに "静的DependencyProperty"パラメータに注意してください。(代わりに静的ではなく、型や型のような他のキーワードを使うこともできます) –

+0

文字列を指定して 'Enum.Parse'と同じ問題が発生します。残念ながら、文字列を拡張することは、intを拡張することほど明白ではありません。 C#に構文がありません! – C4u

答えて

125

要するに、いいえ、できません。

長い答えは、拡張メソッドは単なる構文的な砂糖です。 IE:あなたは、文字列に拡張メソッドを持っている場合

さんが言わせて:

public static string SomeStringExtension(this string s) 
{ 
    //whatever.. 
} 

あなたはそれを呼び出すとき:

myString.SomeStringExtension(); 

コンパイラはちょうどにそれを回す:

ExtensionClass.SomeStringExtension(myString); 

あなたが見るように、静的メソッドのための方法はありません。

もう1つのことが私にもたらされました:実際にはポイントは既存のクラスに静的メソッドを追加できますか?あなただけのように何が本当にできることでbenfitだ、同じことを行い、独自のヘルパークラスを持つことができます。

Helper.ParseBool(..); 

が本当にテーブルに多くをもたらすものではありません

Bool.Parse(..) 

対を...

+136

*既存のクラスに静的メソッドを追加できるのは本当に何でしょうか?*私はこのことを多くの場合繰り返していました。私の推論は: 'String.Reconvert'を拡張メソッドとして拡張したいと思います。私は 'Helper.ReconvertString'を書くことができましたが、Visual Studioを使って自動補完すると、私の同僚は' Helper'の下を見ませんでした。彼らは 'String'メソッドを探し、見つからず、ホイールを再作成する可能性が高いです。 – abelenky

+79

私は完全に同意していませんが、インスタンス化された拡張メソッドが提供するのと同じ利点があります。ヘルパークラスを使って通常の拡張メソッドと同じ目的を果たすこともできますが、拡張アプローチがはるかに上手く機能するときはどうすればよいでしょうか。構文的砂糖は、インスタンス化されていても静的であれ、便利です。 – WiredWiz

+31

私は、文法的な砂糖が出る限り、テーブルにまるで同じように持ち込むと思います。それは、アクセシビリティと、あまり知られていないヘルパーではなく、一般的なクラスになると予想されるものについてです。たとえば、DateTime.FromNanosecondsのような拡張メソッド、またはDateTime.FromSecondsSinceEpochが役に立ちます。これらは本質的にコンストラクタなので、インスタンスメソッドとしては意味がありませんが、静的な拡張メソッドのように簡単に見つけることができます。その理由は、フレームワーククラスは単に不完全であり、拡張メソッドはそれらを完了するための回避策です。 – Triynko

-7

ありませんが、あなたのようなものかもしれない:

bool b; 
b = b.YourExtensionMethod(); 
65

具体的には、int引数を許可するためにBoolean.Parseをオーバーロードします。

intの拡張はできますか?

public static bool ToBoolean(this int source){ 
    //do it 
    //return it 
} 

次に、あなたがこのようにそれを呼び出すことができます。

int x = 1; 

bool y=x.ToBoolean(); 
+11

+1には創造性があります。あなたは彼の質問に答えなかったが、私はあなたが最も優雅な解決策を見つけたと信じている。特に文字通り "解析する"とは、_string_ :)を解析することを意味します([定義](http://en.wikipedia.org/wiki/Parsing)を参照)。 – tsemer

+1

intは値型です。値の型の拡張メソッドでは、値は** NOT ** **参照渡しであるため、@bsneeze 'y = x.ToBoolean()'と書かれています。 – LuckyLikey

-2

あなたはこの

 bool bool1 = 0.Parse(); 
     bool bool2 = 1.Parse(); 

     bool? bool3 = 0.Parse2(); 
     bool? bool4 = 1.Parse2(); 
     bool? bool5 = 3.Parse2(); 
+4

これは質問に答えません。これは、 'int'のインスタンス(この場合は0,1,2、または3)に対して呼び出される通常の拡張メソッドを示しています。' int'リテラルは変数と同じくらいのインスタンスです。 – ProfK

+2

また、これを行わないでください。これまで'' 1.Parse() 'は' 'My String '÷6'と意味がありません。あなたのコードは他人にはっきりと理解できるものでなければなりません。 "解析する"とは、上記の@tsemerとして "文字列を分析する"ことです。 –

関連する問題