2016-10-08 8 views
0

私の下のコードは正常に動作しますが、移植性を向上させたいと思います。 priceLevelsのインデックス番号は変更される可能性があるので、プログラムを更新する必要はなく、これらのインデックス番号を設定するための設定オプションが必要です。インデックス値の列挙型ではなく、代替オブジェクト

また、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; 
    } 
} 

誰もが私の代替物を提案することができるだろう -

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

someString = thisCustomer.priceLevel.ToString() 

:私の使用法のようなものになるだろうので

PriceLevelクラスは、私のCustomersクラスの一部になりますpriceLevels列挙型の代わりに使用できますか?

答えて

2

priceLevelsを他のものに使用するかどうかわかりません。 PriceLevelクラスを変更したり、priceLevels列挙型を削除した場合は、Customerクラスを変更するか、価格レベル値を保存する方法を変更する必要があります。

priceLevels列挙する場合。あなたはこのためにattibute記述を使用して、プロジェクト内の単純な拡張を含めることができます。

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(); 
} 

用途:

someString = thisCustomer.priceLevel.priceLevel.GetDescription() 

か、タイプでこれにプロパティPriceLevelをごCustomerクラスを変更して含めることができますpriceLevels

someString = thisCustomer.PriceLevel.GetDescription() 

私はこれを使用して、私はリソースファイルを含めるsomethimes。私はこの資源の中に愚かな記述を保存することができるからです。

+0

おかげで、私は 'どこか他のPriceLevel'必要はないと思うので、私はそれを追加するために、最も理にかなっていると思います私のクラスにプロパティ。私が列挙型のインデックスを変更できるようにするためには、デフォルト値を持つ配列に対応させるために使用すると思います。次に、設定ファイルを持つことができます。配列の値を変更します。 – Adjit

1

Enumを使用しない主な理由がToString()の場合は、メンバーに属性を追加し、@andres提案の拡張メソッドを使用して結果を上書きできます。あなたがより複雑な構造をしたい場合は、列挙型をシミュレートし、機能を追加することができます。

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"; 
    } 
} 
関連する問題