2012-02-15 18 views
2

私はenumを一般的に扱う方法を見つけようとしていますが、それを動作させる方法を見つけることができません。一般的な列挙型として扱う?

public enum ABC { 
    One, 
    Two, 
    Three 
} 

public enum DEF { 
    Four, 
    Five, 
    Six 
} 

と私は、パラメータとして列挙型を取り、単にこのような列挙型の名前を返すメソッドを書きたい:

public string GetEnumName(Enum anEnum) { 
    return anEnum.GetType().Name; 
} 

が、場合、私はいくつかの列挙型は、このような何かを宣言していると言います私はそれをGetEnumName(DEF)のように呼びます。私は '変数は、変数として使用されている'エラーです。何か案は?ありがとう

EDIT申し訳ありませんが、私は十分にはっきりしていない可能性があります。私は単にタイプから名前を取得する方法ではなく、問題を説明するための非常に単純な例としてGetEnumNameを選択しました。場合は、この時点で

public string GetEnumName(Type enumType) 
{ 
    return enumType.Name; 
} 

そして

GetEnumName(typeof(ABC)); 

:基本的に私は私がするために、任意の列挙型を渡すと、それは直接その列挙型に基づいて行動してい、感謝

+2

あなたは 'typeof(DEF)'を望んでいると思います – mydogisbox

+0

列挙型の名前(例えばGetEnumName(ABC)== "ABC")または値の名前を探していますか?たとえばGetEnumName(ABC.One )== "One")? –

+0

より一般的には、期待される戻り値のいくつかの例を挙げることができますか? – phoog

答えて

1

これはおそらくトリックですか? 、型パラメータ制約を持つ一般的な方法である

public string GetEnumName<T>() where T : Enum 
{ 
    return typeof(T).Name; 
} 

:あなたが書きたい何

public static class EnumExtensions 
{ 
    public static string GetEnumName<T>(this T value) where T : struct 
    { 
     var type = typeof(T); 
     if (!type.IsEnum) 
      throw new InvalidOperationException(string.Format("{0} is not an enum", type)); 
     return type.GetEnumName(value); 
    } 
} 
+0

はい、それは私が運転していたものでした、あなたとローマ人は私が後にあったことを理解しました – snappymcsnap

0

ジャストタイプを渡すことができます方法をしたいですあなたのメソッドはおそらくちょうど代わりにtypeof(ABC).Nameを使用することができる何もしません。

+0

私は、文字列として(一般的に定義されている)いくつかの列挙型の特定の値の名前を望んでいると思います。 –

3

用途:

public static string GetTypeName<T>() 
{ 
    return typeof(T).Name; 
} 

使用法:

var result = GetTypeName<DEF>(); 
0

あなたがすることはできません。 Enum型(System.Enumを含む)では一般的な制約は認められません。代わりにEnum.GetNameを使用してください。

1

問題は、System.Typeの代わりに型を渡していることです。方法を次のように変更してください。

public string GetEnumName(Type enumType) { 
    return enumType.Name; 
} 
1

はこのようなものです。

残念ながら、C#でenumにこのような制約を定義する方法はありません(また、代理人用に定義することもできません)。人々は通常、@ananthonlineによって言及された解決策に行きます。

実際、このような制約はC#言語ではサポートされていませんが、CLRレベルでサポートされています。たとえばMono.Cecilのようなツールを使用すると、アセンブリを変更し、コンパイルした後にメソッドに制約を適用するのに役立ちます。

は、この記事に見てください: Cecil constraint patcher

とがあることを忘れないでください:あなたは非C#はジェネリック型パラメータの制約を担持さ適用するプロセスを容易にツールを見つけることができます

Constraining generic constraints enum のメンバーの名前と値を使用したい場合は、Enumクラスの便利な静的メソッドの多くがです。

+0

はい、私が運転していたものでした、あなたとananthonlineは、 – snappymcsnap

関連する問題