枚举值作为字符串的字典

本文关键字:字典 字符串 枚举 | 更新日期: 2023-09-27 18:27:19

我正在尝试制作一个API,其中一个函数API将Enum作为参数,然后对应于所使用的字符串。

public enum PackageUnitOfMeasurement
{
        LBS,
        KGS,
};

编写代码的琐碎方法必须列出代码中的每个案例。但由于它们是30种情况,所以我试图避免这种情况,并使用Dictionary Data Structure,但我似乎无法将值与枚举的关系联系起来。

if(unit == PackageUnitOfMeasurement.LBS)
       uom.Code = "02";  //Please note this value has to be string
else if (unit == PackageUnitOfMeasurement.KGS)
       uom.Code = "03";

枚举值作为字符串的字典

以下是一种将映射存储在字典中并稍后检索值的方法:

var myDict = new Dictionary<PackageUnitOfMeasurement,string>();
myDict.Add(PackageUnitOfMeasurement.LBS, "02");
...
string code = myDict[PackageUnitOfMeasurement.LBS];

另一种选择是使用类似DecriptionAttribute的东西来装饰每个枚举项,并使用反射来读取这些项,如Getting attributes of Enum’s value:中所述

public enum PackageUnitOfMeasurement
{
        [Description("02")]
        LBS,
        [Description("03")]
        KGS,
};

var type = typeof(PackageUnitOfMeasurement);
var memInfo = type.GetMember(PackageUnitOfMeasurement.LBS.ToString());
var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute),
    false);
var description = ((DescriptionAttribute)attributes[0]).Description;

第二种方法的好处是,您可以将映射保持在靠近枚举的位置,如果其中任何一个发生更改,则不需要查找任何其他需要更新的位置。

您可以指定枚举元素的数值

public enum PackageUnitOfMeasurement {
    None = 0,
    LBS = 2,
    KGS = 3,
    TONS = 0x2a
};

然后你可以简单地用转换单位

uom.Code = ((int)unit).ToString("X2");

注:

最根本的问题是,对单元进行硬编码是否是个好主意。通常,这类东西应该放在数据库的查找表中,这样就可以随时轻松地添加新的单元,而无需更改程序代码。


更新:

我添加了一个包含HEX代码的示例。格式"X2"产生一个两位数的十六进制值。以十六进制表示法输入所有大于9的数字,如c#中的0xA == 100x10 == 16

我会使用附加到枚举的属性。像这样:

var type = typeof(PackageUnitOfMeasurement);
var memInfo = type.GetMember(PackageUnitOfMeasurement.LBS.ToString());
var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute),
    false);
var description = ((DescriptionAttribute)attributes[0]).Description;

这取自这个问题,Getting attributes of Enum';s值。它特别询问返回枚举属性。

Oded的解决方案很好,但我过去使用的一种替代方案是使用附加到包含相应字符串的枚举值的属性。

以下是我所做的。

public class DisplayStringAttribute : Attribute
{
    private readonly string value;
    public string Value
    {
        get { return value; }
    }
    public DisplayStringAttribute(string val)
    {
        value = val;
    }
}

然后我可以这样定义我的枚举:

public enum MyState 
{ 
    [DisplayString("Ready")]
    Ready, 
    [DisplayString("Not Ready")]
    NotReady, 
    [DisplayString("Error")]
    Error 
};

而且,出于我的目的,我创建了一个转换器,这样我就可以绑定到枚举:

public class EnumDisplayNameConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Type t = value.GetType();
        if (t.IsEnum)
        {
            FieldInfo fi = t.GetField(value.ToString());
            DisplayStringAttribute[] attrbs = (DisplayStringAttribute[])fi.GetCustomAttributes(typeof(DisplayStringAttribute),
                false);
            return ((attrbs.Length > 0) && (!String.IsNullOrEmpty(attrbs[0].Value))) ? attrbs[0].Value : value.ToString();
        }
        else
        {
            throw new NotImplementedException("Converter is for enum types only");
        }
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Oded的解决方案可能执行得更快,但该解决方案具有很大的灵活性。如果你真的想的话,你可以添加一大堆属性。但是,如果你这样做了,你可能会更好地创建一个类,而不是使用枚举!

PackageUnitOfMeasurement.LBS的默认值为0,同样PackageUnitOfMeasurement.KBS1

因此,PackageUnitOfMeasurement的集合实际上是包含整数值的集合(即int)。

你的问题还不完全清楚。。。。

Dictionary集合有一个Key和一个Value,听起来像是要使用PackageUnitOfMeasurement。它有一个Key,这对于将值强制转换为整数来说是微不足道的。

PackageUnitOfMeasurement example = PackageUnitOfMeasurement.LBS
int result = (int)example;
var myDict = new Dictionary<PackageUnitOfMeasurement,string>(); 
myDict.Add(result,"some value here"