2016-07-16 2 views
0

です:タイトルのために述べたように...エラーCS1109 t拡張メソッドは、トップレベルの静的クラスで定義する必要があります。パターンは私が文字列オブジェクトを拡張し、ネストされたクラスの拡張部分を持っている、しかし、直接このようにそれをやってしたいと思い、ネストしたクラス

public static class StringExtensions 
{ 
    public static class Patterns 
    { 
     public static string NumbersOnly(this string s) 
     { 
      return new String(s.Where(Char.IsDigit).ToArray()); 
     } 
    } 
} 

するとエラーになりますこの投稿の私はそれを呼び出すとき、それは次のように呼び出すことができるように

がどのように違っこれを書くことができます:

string s = "abcd1234"; 
s = s.Patterns.NumbersOnly(); 

私はエラーが離れて行く作るためにStringExtensionsの直接の子としてNumbersOnly移動することができます知っています、しかし私の意図は、メソッドをたくさん持つカテゴリにメソッドを編成することです。などPatternNumbersOnlyまたはNumbersOnly

注:この質問は異なり、この例では、NumbersOnlyはただ一つ、約40のパターンは、私がそこに持っていき、私はのようなメソッドを持つオブジェクトの根の乱雑にしたくないと一致するのですなぜこの問題が存在するのか尋ねていないので、このエラーの理由が私を否定している機能や同様の機能を持つことができるように回避策を探しています。this one

+0

これはで動作します迅速。 C#コンパイラチームは、それを調べて、実際にそれがコストに大きな価値を追加しないと判断したので、実装しません(近い将来に少なくとも) – Mafii

+0

@Mafii - あなたはソースを提供できますか?あなたの声明を検証してください。 –

+0

http://stackoverflow.com/a/619047/5962841 – Mafii

答えて

5

「拡張プロパティ」はありません。

Patterns拡張メソッドから戻る中間クラスを導入して、s.Patterns().NumbersOnly()が得意です。

サンプルは、単一のクラスのすべてのメソッドを置きますが、あなたは「トップレベル静的クラスで定義された」限り、拡張メソッドが満たすよう、異なるクラスにそれらをあなたが好きなように整理することができます。

public static class StringExtensions 
{ 
    public class PatternsX 
    { 
    public string Value {get;set;} 
    } 

    public static PatternsX Patterns(this string s) 
    { 
    return new PatternsX { Value = s}; 
    } 

    public static string NumbersOnly(this PatternsX s) 
    { 
    return new String(s.Value.Where(Char.IsDigit).ToArray()); 
    } 
} 

....  
Console.WriteLine("123ver".Patterns().NumbersOnly()); // results in 123 
+2

また、 'NumbersOnly'は' PatternsX'のインスタンスメソッドにすぎません。 – hvd

+0

私はあなたが何をしたかを見て、基本的に自身のインスタンスを '.Patterns'オブジェクトにマップしました。理想的ではありませんが、メモリの節約のために、 'string'オブジェクトのルートにあるメソッドの反映されていないインスタンスを残すだけです。これを正しい解決策としてマークし、上書きする。私はあなたがこれで正しいと信じています。うまくいけば、C#7は拡張性に優れた組織を採用することを望むでしょう。私のコードを継承するフレームワークを持つことができるだけの幸せ:) –

関連する問題