2017-04-13 16 views
0

どこにでもある命名規則を使用して戻り値がどこにあるかわかりました。 ラクダのケースからパスカルのケースからパスケースの文字列へのスペースへのスペース...混乱...C#変更された列挙型の名前の値を取得する方法

ので、それをシリアル化または逆シリアル化するためには、json.netを使用してjsonSerializerを追加したり、JSONのプロパティを持つクラスを追加することは十分に簡単ですが、ように属性:

[JsonProperty(PropertyName = "somebanged upName")] 
public string[] SomethingBangedUp; 

私もやりたいですいくつかの値を列挙型にハードタイピングするときに同様のことをしてから、varではなく「勇気付けられた名前」のリストを取得するiable名:

public enum SomeBangedUpEnum 
{ 
    [EnumMember(Value = "someThingelse BangedUp")] 
    SomethingElseBangedUp, 
} 

var v = Enum.GetNames(typeof(SomeBangedUpEnum)).ToList(); 

しかし、これは「SomethingElseBangedUp」ではなく「someThingelse BangedUp」私が望んとしての変数名をretrives。

EnumMember属性で設定された値をどのように得ることができますか?

+1

をあなたが列挙メンバーのためのすべての名前を取得したい場合こちら:http://stackoverflow.com/a/1415187/5311735をご覧ください。また、(System.ComponentModel名前空間の) 'Description'属性のようなものを使用してください。 EnumMemberはシリアライゼーションに関連していて、ここでは完全にエイリアンです(別の名前が示唆されていても)。 – Evk

+0

これは良い情報です...どのように私はこの説明の属性を持つすべてを取得する答えを調整するかもしれません...(そして、それらの属性のない通常の変数名) – axa

答えて

1

属性はメタデータです。メタデータを読みたい場合は、リフレクションを使用する必要があります。拡張子GetCustomAttributeを使用して、typeメンバーの属性値を読み取ることができます。例えば。

var v = typeof(SomeBangedUpEnum) 
    .GetFields(BindingFlags.Public|BindingFlags.Static) 
    .Select(f => f.GetCustomAttribute<EnumMemberAttribute>()?.Value) 
    .ToList(); 

それとも、いくつかの特定の列挙型のメンバーの名前を取得したい場合は、代わりにすべてのフィールドを取得するあなたは、特定のフィールドを取得することができます::

var name = typeof(SomeBangedUpEnum) 
    .GetField(SomeBangedUpEnum.SomethingElseBangedUp.ToString()) 
    .GetCustomAttribute<EnumMemberAttribute>()?.Value; 
+0

なぜ私にはEnumMemberAttributeが認識されないのですか? – axa

+0

@axa 'System.Runtime.Serialization'名前空間と' System.Reflection'名前空間の両方を使用して追加する必要があります。 –

+0

すべては問題ありませんが、これはEnumMember属性を使用する意味がほとんどありません。ここではシリアライゼーションはありません。おそらく、System.ComponentModelのDescription属性を使用するほうがよいでしょう。しかし、それはもちろんニックピッキングです。 – Evk

関連する問題