2011-07-01 24 views
0

私はEnumを取り、もしあれば、StringValueAttributeの値を返す拡張メソッド(GetStringValue)を行いました。拡張メソッドと列挙

私は今Dim sValue = MyEnum.BlaBla.GetStringValue()

を行うことができ、私は文字列のリストとして私にすべて列挙値を返す「拡張子」の方法をしたいです。

私はこのようにそれを適用したい:MyEnum.GetStringValues()

それは可能ですか?

答えて

3

あなたは型に静的な拡張メソッドを追加することはできませんが、以下のように、あなたは新しいクラスを宣言することができます:

class EnumHelper 
{ 
    public static IEnumerable<string> GetStringValues<TEnum>() 
     where TEnum : struct, IComparable, IFormattable, IConvertible 
    { 
     var enumType = typeof(TEnum); 

     if (!enumType.IsEnum) { 
      throw new ArgumentException("T must be an enumerated type"); 
     } 

     foreach (Enum item in Enum.GetValues(enumType)) 
     { 
      yield return item.GetStringValue(); 
     } 
    } 
} 

と、次のようにそれを呼び出す:あなたはどこ

class Program 
{ 
    enum Rainbow { Red, Orange, Yellow, Green, Blue, Indigo, Violet } 

    static void Main(string[] args) 
    { 
     foreach (var item in EnumHelper.GetStringValues<Rainbow>()) 
     { 
      Console.WriteLine(item); 

     } 

     Console.ReadKey(false); 
    } 
} 
+0

汎用メソッド型パラメータにEnum制約を追加できますか? – serhio

+0

残念ながら私はあなたができるとは思っていませんが、あなたができる最善のことは、Jon Skeetが答えられるのを待つことです(私は彼が彼の本でそれをカバーしていると思います)。そうではありません。 –

+0

@serhio:いいえ、あなたができるのは値の型の制約です。 – jason

2

可能でしょうか?

いいえ特定のタイプのインスタンスには拡張メソッドを追加できますが、特定のタイプ自体には追加できません。

これについて考えてみましょう。拡張メソッドは、メソッドの最初のパラメータが拡張メソッドの「受信者」である静的クラスの静的メソッドの単なる構文上の砂糖です。最初のパラメータ何かMyEnumのような静的なクラスに静的メソッドを書くことは可能ですか?いいえ。メソッドにパラメータとして型名を渡すことはできません(型ハンドル名のインスタンス(例えば、typeof(MyEnum))は渡すことができますが、型名自体は渡せません)。したがって、あなたが求めていることは不可能です。

+0

は不思議このメソッドを追加することをお勧めしますか? tahat enumのインスタンスへの拡張メソッド? – serhio

関連する問題