替代对象而不是使用枚举作为索引值

时间:2016-10-08 19:49:04

标签: c# enums

我的下面的代码工作正常,但是,我想尝试提高其可移植性。 priceLevels索引号可能会发生变化,因此我不想更新程序,而是希望有一个设置选项来设置这些索引号。

我还希望能够控制ToString()类的PriceLevel方法。

PriceLevel课程将成为我Customers课程的一部分,所以我的用法如下:

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

是否有人能够建议我可以使用的替代对象代替priceLevels枚举?

2 个答案:

答案 0 :(得分:2)

我不知道你是否使用priceLevels来做其他事情。因为如果您更改PriceLevel课程或删除priceLevels枚举,那么您需要更改Customer课程或者如何保存价格等级值。

如果你保持priceLevels枚举。您可以为此使用属性描述,并在项目中包含一个简单的扩展名:

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

或者您可以更改Customer课程,并在其中添加PriceLevel类型的属性priceLevels

 someString = thisCustomer.PriceLevel.GetDescription()

当我使用它时,有些时候我会包含一个资源文件。因为我可以在此资源中保存muy描述。

答案 1 :(得分: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";
    }
}