替代对象,而不是为索引值使用枚举
本文关键字:索引值 枚举 对象 | 更新日期: 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";
}
}