2017-07-14 3 views
0

Verwenden von C# Ist es möglich, Eigenschaften für jedes Enum-Objekt zu verwenden?Ist es möglich, dem C# enum-Objekt benutzerdefinierte Eigenschaften hinzuzufügen?

Ich habe die Description Attribute verwendet, um englische Beschreibung zu einem enum Element hinzuzufügen.

Hinzufügen zu jedem Element englische Ich habe folgendes getan

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

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

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

Dann GetDescription() eine Erweiterungsmethode zu meinem enum rief ich hinzugefügt, die mir die Beschreibung wie so

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; 
} 
erhalten können

Allerdings wird es mir sehr helfen, wenn ich eine Klasse zuweisen oder ein neues Objekt konstruieren kann.

Ist es möglich/Wie kann ich etwas wie das Folgende tun?

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

oder eine Klasse mit für diese

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

Sie können [Ihre eigene benutzerdefinierte Attributklasse erstellen] (https://docs.microsoft.com/en-us/dotnet/standard/attributes/writing-custom-attributes). – Leandro

+5

An diesem Punkt, sollten Sie nicht einfach Polymorphie anstelle von Enums verwenden? –

+0

Enum's sind im Wesentlichen ganze Zahlen und Sie möchten ein int, eine Zeichenfolge und eine Klasse speichern, verwenden Sie ein 'Tuple tuple = neues Tuple (1," Erstes Element ", neue MyCustomClass (richtig, 1)); ' –

Antwort

0

Sie können erstellen noch eine weitere Erweiterung Methode.

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

es dann wie so verwenden:

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

aberSie wirklich in Betracht ziehen sollten, eine Fabrik zu schaffen Ihre Objekte zu erstellen.

0

Sie können Elemente mit benutzerdefinierten Attributen dekorieren. Diese können fast alles enthalten, was Sie wollen.

[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; 
    } 
} 

würden Sie diese wie folgt verwenden:

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

Sie haben bereits den Code dieses Attribut in Ihrer Frage zu lesen.

Verwandte Themen