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

本文关键字:索引值 枚举 对象 | 更新日期: 2023-09-27 18:12:15

我下面的代码工作得很好,但是,我想尝试改进它的可移植性。priceLevels索引号可能会改变,所以我不需要更新程序,我希望有一个设置选项来设置这些索引号。

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

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 enum?

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

我不知道你是否将priceLevels用于其他用途。因为如果您更改PriceLevel类或删除priceLevels enum,也许您也需要更改Customer类或如何保存价格级别值的方式。

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

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

当我使用这个时,有时我包含一个资源文件。因为我可以在这个资源中保存很多描述

如果不使用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";
    }
}