2017-07-14 7 views
0

C#の使用各列挙型アイテムのプロパティを関連付けることは可能ですか?c#enumオブジェクトにカスタムプロパティを追加することはできますか?

私はを使用して、enumアイテムに英語の説明を追加しました。私は、次の

public enum MyEnum 
{ 
    [Description("My First Item")] 
    First, 

    [Description("My Second Item")] 
    Second, 

    [Description("My Third Item")] 
    Third 
} 

を行っている各項目に英語の説明を追加するには

は、それから私は私がそう

public static string GetDescription(this Enum value) 
{ 
    Type type = value.GetType(); 

    string name = Enum.GetName(type, value); 

    if (name != null) 
    { 
     FieldInfo field = type.GetField(name); 
     if (field != null) 
     { 
      DescriptionAttribute attr = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; 
      if (attr != null) 
      { 
       return attr.Description; 
      } 
     } 
    } 

    return name; 
} 

のような説明を取得することができますGetDescription()と呼ばれる私のenumに拡張メソッドを追加しましたただし、クラスを割り当てたり、新しいオブジェクトを作成したりすることができれば、多くの助けになります。

これは可能ですか?次のようなことをするにはどうすればよいですか?

public enum MyEnum 
{ 
    [Description("My First Item"), new { IsFirst = true, UnitType = 1}] 
    First 
} 

やクラスを使用して

public enum MyEnum 
{ 
    [Description("My First Item"), new MyCustomClass(true, 1)] 
    First 
} 
+2

あなた自身のカスタム属性クラスを作成できます(https://docs.microsoft.com/en-us/dotnet/standard/attributes/writing-custom-attributes)。 – Leandro

+5

この時点で、enumを使用する代わりにポリモフィズムを使用するべきではありませんか? –

+0

列挙型は本質的に整数で、あなたはint型、文字列型、クラス型を格納したいので、 'Tuple tuple = new Tuple (1、" First Item "、新しいMyCustomClass true、1)); ' –

答えて

0

あなたは、このためのさらに別の拡張子メソッドを作成することができます。

public static object Create(this MyEnum enum) 
{ 
    switch (enum) 
    { 
     case MyEnum.First: 
       return new { IsFirst = true, UnitType = 1}]; 
     case MyEnum.Second: 
       return new ... 
     default: 
       ... 
    } 
} 

そのようにようにそれを使用します。

dynamic first = MyEnum.First.Create(); 
var isFirst = first.IsFirst; 

しかしあなたが本当にあなたのオブジェクトを作成するために工場を作成することを検討すべきです。

0

カスタムアトリビュートで要素を飾ることができます。それらはあなたが望むほぼすべてを含むことができます。

[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] 
public class DescriptorAttribute : Attribute 
{ 
    public bool IsFirst { get; } 
    public int UnitType { get; } 

    public DescriptorAttribute(bool isFirst, int unitType) 
    { 
     IsFirst = isFirst; 
     UnitType = unitType; 
    } 
} 

次のようにして、これを使用します。

public enum Test 
{ 
    [Descriptor(isFirst: true, unitType: 2)] 
    Element 
} 

すでにあなたの質問に、この属性を読み込むためのコードを持っています。

関連する問題