私はEnum
を取り、もしあれば、StringValueAttribute
の値を返す拡張メソッド(GetStringValue)を行いました。拡張メソッドと列挙
私は今Dim sValue = MyEnum.BlaBla.GetStringValue()
を行うことができ、私は文字列のリストとして私にすべて列挙値を返す「拡張子」の方法をしたいです。
私はこのようにそれを適用したい:MyEnum.GetStringValues()
それは可能ですか?
私はEnum
を取り、もしあれば、StringValueAttribute
の値を返す拡張メソッド(GetStringValue)を行いました。拡張メソッドと列挙
私は今Dim sValue = MyEnum.BlaBla.GetStringValue()
を行うことができ、私は文字列のリストとして私にすべて列挙値を返す「拡張子」の方法をしたいです。
私はこのようにそれを適用したい:MyEnum.GetStringValues()
それは可能ですか?
あなたは型に静的な拡張メソッドを追加することはできませんが、以下のように、あなたは新しいクラスを宣言することができます:
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);
}
}
可能でしょうか?
いいえ特定のタイプのインスタンスには拡張メソッドを追加できますが、特定のタイプ自体には追加できません。
これについて考えてみましょう。拡張メソッドは、メソッドの最初のパラメータが拡張メソッドの「受信者」である静的クラスの静的メソッドの単なる構文上の砂糖です。最初のパラメータ何かMyEnum
のような静的なクラスに静的メソッドを書くことは可能ですか?いいえ。メソッドにパラメータとして型名を渡すことはできません(型ハンドル名のインスタンス(例えば、typeof(MyEnum)
)は渡すことができますが、型名自体は渡せません)。したがって、あなたが求めていることは不可能です。
は不思議このメソッドを追加することをお勧めしますか? tahat enumのインスタンスへの拡張メソッド? – serhio
汎用メソッド型パラメータにEnum制約を追加できますか? – serhio
残念ながら私はあなたができるとは思っていませんが、あなたができる最善のことは、Jon Skeetが答えられるのを待つことです(私は彼が彼の本でそれをカバーしていると思います)。そうではありません。 –
@serhio:いいえ、あなたができるのは値の型の制約です。 – jason