我的下面的代码工作正常,但是,我想尝试提高其可移植性。 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
枚举?
答案 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";
}
}