2016-10-08 3 views
0

Mein unten stehender Code funktioniert gut, jedoch möchte ich versuchen, seine Portabilität zu verbessern. DieIndexnummern können sich ändern, so dass ich anstelle einer Aktualisierung des Programms eine Einstellungsoption zum Einstellen dieser Indexnummern haben möchte.Alternatives Objekt anstelle einer Enumeration für Indexwerte

Ich möchte auch in der Lage sein, die ToString() Methode für die PriceLevel Klasse zu steuern.

Die PriceLevel Klasse wird ein Teil meiner Customers Klasse sein, so dass meine Verwendung so etwas wie wäre:

if(someOtherVariable == thisCustomer.priceLevel) //do some stuff 

someString = thisCustomer.priceLevel.ToString() 

-

public enum priceLevels 
{ 
    SELECT = 2, 
    PLUS = 3, 
    PREMIER = 3, 
    EFI = 4, 
    MSELECT = 5, 
    SPECIAL = 6 
} 

class PriceLevel 
{ 
    public priceLevels priceLevel { get; set; } 

    public override string ToString() 
    { 
     string myString = "No Level Set"; 

     if (priceLevel == priceLevels.SELECT) return "Partner-Select"; 
     if (priceLevel == priceLevels.PLUS) return "Plus/Premier"; 
     if (priceLevel == priceLevels.PREMIER) return "Plus/Premier"; 
     if (priceLevel == priceLevels.EFI) return "eFi Plus-SPA"; 
     if (priceLevel == priceLevels.MSELECT) return "mSelect"; 
     if (priceLevel == priceLevels.SPECIAL) return "Special"; 

     return myString; 
    } 
} 

der Lage wäre, jemand ein alternatives Objekt legen nahe, dass ich kann anstelle der enum verwenden?

Antwort

2

Ich weiß nicht, ob Sie für etwas anderes verwenden. denn wenn Sie PriceLevel Klasse ändern oder entfernen Sie die priceLevels Enum, meybe müssen Sie Customer Klasse ändern oder die Art und Weise, wie Sie den Preislevel Wert speichern.

Wenn Sie priceLevels enum behalten. Sie können eine attibute Beschreibung für dieses und in Ihrem Projekt eine einfache Erweiterung verwenden:

public enum priceLevels 
{ 
    [Description("Partner-Select")] 
    SELECT = 2, 
    [Description("...")] 
    PLUS = 3, 
    [Description("...")] 
    PREMIER = 3, 
    [Description("...")] 
    EFI = 4, 
    [Description("...")] 
    MSELECT = 5, 
    [Description("...")] 
    SPECIAL = 6 
} 

public static string GetDescription(this Enum enumValue) 
{ 
    var fi = enumValue.GetType().GetField(enumValue.ToString()); 

    var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 

    return (attributes != null && attributes.Length > 0) 
       ? attributes[0].Description 
       : enumValue.ToString(); 
} 

Verwendung:

someString = thisCustomer.priceLevel.priceLevel.GetDescription() 

oder Sie können Ihre Customer Klasse und gehören in diese eine Eigenschaft PriceLevel mit der Art ändern priceLevels:

someString = thisCustomer.PriceLevel.GetDescription() 

Als ich diese, somethimes schließe ich eine Ressource-Datei. weil ich in dieser resource muy beschreibung speichern kann.

+0

Danke, ich glaube nicht, dass ich die 'brauchen anderswo PriceLevel', so dass ich denke, dass es am meisten Sinn macht das hinzufügen Eigentum zu meiner Klasse. Soweit ich in der Lage sein muss, den Index der Enumeration zu ändern, denke ich, dass ich das einfach verwenden werde, um einem Array mit Standardwerten zu entsprechen, dann kann ich einfach eine Einstellungsdatei haben, und wenn es andere Werte für die Aufzählung wird den Wert im Array ändern. – Adjit

1

Wenn der Hauptgrund, Enum nicht zu verwenden, der ToString() ist, können Sie das Ergebnis überschreiben, indem Sie ein Attribut für die Mitglieder hinzufügen und eine Erweiterungsmethode als @andres suggest verwenden; wenn Sie eine komplexere Struktur wollen, können Sie eine ENUM und fügen Funktionalitäten simulieren:

public struct PriceLevels 
{ 
    public static PriceLevels NONE = 0; 

    public static PriceLevels SELECT = 2; 
    public static PriceLevels PLUS = 3; 
    public static PriceLevels PREMIER = 3; 
    public static PriceLevels EFI = 4; 
    public static PriceLevels MSELECT = 5; 
    public static PriceLevels SPECIAL = 6; 

    public bool Equals(PriceLevels other) => _number == other._number; 

    public override bool Equals(object obj) => !ReferenceEquals(null, obj) && obj is PriceLevels && Equals((PriceLevels) obj); 

    public override int GetHashCode() => _number; 

    readonly int _number; 

    PriceLevels(int number) 
    { 
     _number = number; 
    } 

    public static implicit operator PriceLevels(int number) => new PriceLevels(number); 

    public static bool operator ==(PriceLevels leftLevel, PriceLevels rightLevel) => leftLevel._number == rightLevel._number; 

    public static bool operator !=(PriceLevels leftLevel, PriceLevels rightLevel) => !(leftLevel == rightLevel); 

    public override string ToString() 
    { 
     if (this == SELECT) return "Partner-Select"; 
     if (this == PLUS) return "Plus/Premier"; 
     if (this == PREMIER) return "Plus/Premier"; 
     if (this == EFI) return "eFi Plus-SPA"; 
     if (this == MSELECT) return "mSelect"; 
     if (this == SPECIAL) return "Special"; 

     return "No Level Set"; 
    } 
} 
Verwandte Themen