2016-04-20 10 views
0

は、私はこの列挙を持って言う:列挙型インスタンスの名前を取得します

public enum MyEnum{ 
    ValueOne = 1, 
    ValueTwo = 2, 
    ValueThree = 3 
} 

そして、このフィールド/変数:

public MyEnum myEnumInstance = MyEnum.ValueTwo; 

私は別のクラスからの反射経由myEnumInstancenameを取得する必要があります。

私が試した:

関係なく常にに設定されているものをmyEnumInstanceValueOneを返さない
myClassInstance.GetType().GetField("myEnumInstance").GetValue(myClassInstance) 

を。

リフレクションで列挙型フィールドの文字列値/名前を取得するにはどうすればよいですか?

+0

[値の列挙文字列名](http://stackoverflow.com/questions/309333/enum-string-name-from-value)の可能性のある重複 – FiringSquadWitness

+0

@FiringSquadWitnessいやない重複し、私の質問は全く違います。 –

+0

私はまだリフレクションが必要な理由についてはっきりしていません...なぜ「myClassInstance.myEnumInstance.ToString()」ではないのですか? –

答えて

2

あなたは反射を必要としません。 .ToString()に電話するだけです。

myEnumInstance.ToString(); 

これは"ValueTwo"を出力します。あなたはリフレクションを使用して主張すれば

ただし、次の例では、正常に動作します:

myClassInstance.GetType() 
       .GetField(nameof(myEnumInstance)) 
       .GetValue(myClassInstance); 
:C#6であなたもいくつかの強く型付けされたシンタックスシュガーのため nameofを使用することができます

var myClassInstance = new MyClass(); 
myClassInstance.GetType() 
       .GetField("myEnumInstance") 
       .GetValue(myClassInstance); 

public enum MyEnum 
{ 
    ValueOne = 1, 
    ValueTwo = 2, 
    ValueThree = 3 
} 

public class MyClass 
{ 
    public MyEnum myEnumInstance = MyEnum.ValueTwo; 
} 

に留意されたいです。

フィールドにまだアクセスできない場合は、適切なバインディングフラグを渡す必要があるサンプルコードで説明されているようにパブリックではないためです。

myClassInstance 
    .GetType() 
    .GetField(nameof(myEnumInstance), 
     BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance) 
    .GetValue(myClassInstance); 
+0

私は別のクラスからこれにアクセスしていることを追加するために質問を編集しました。私がこれをやっている方法は、反映が必要です。私が信じてくれれば、私は 'myEnumInstance.ToString();'と言っていました。それは簡単です:) –

+2

編集しても 'myClassInstance.myEnumInstance.ToString()'を呼び出せるはずですか? – NStuke

+0

@KeithM NStukeはあなたの編集に基づいて正しいはずです。それでも '.ToString()'を呼び出すことができます。 –

関連する問題