如何获取按位枚举的属性

时间:2016-06-10 15:30:02

标签: c# enums system.reflection

我是按位枚举,它有多个值,每个值都有一个描述属性。

    [Flags]
public enum ParkingAreaType
{
    [Description("Car Park")]
    CarPark = 1,

    [Description("Residential Permit")]
    ResidentialPermitZone = 2,

    [Description("Commercial Permit")]
    CommercialPermitZone = 4,

    [Description("On Street Parking")]
    OnStreetParking = 8,

    Any =
        CarPark | ResidentialPermitZone | CommercialPermitZone 
}

我已经使用并尝试了多种扩展方法,我在其他几个与此

相似的问题上找到了这些方法

Getting attributes of Enum's value

How to get attributes of enum

我目前正在使用John Skeets EnumInternals的代码片段 https://github.com/jskeet/unconstrained-melody/blob/master/UnconstrainedMelody/EnumInternals.cs

private static string GetDescription(T value)
    {
        FieldInfo field = typeof(T).GetField(value.ToString());
        return field.GetCustomAttributes(typeof(DescriptionAttribute), false)
                    .Cast<DescriptionAttribute>()
                    .Select(x => x.Description)
                    .FirstOrDefault();
    }

如果我只传入一个枚举,上面的代码将起作用,但如果我传入一个按位枚举,它将抛出一个Object Reference。我从不同的例子中尝试了以上几种不同的变体,但都有相同的结果。

我只是想弄清楚如何获取传入的描述列表。

1 个答案:

答案 0 :(得分:3)

那是因为没有例如CarPark | ResidentialPermitZone | CommercialPermitZone的字段(或CarPark | ResidentialPermitZone等)。

您必须检索位组合的每个值,例如:

var result = new List<string>();
foreach (var parkingAreaType in Enum.GetValues(typeof(ParkingAreaType)))
{
    if (value.HasFlag(parkingAreaType))
    {
        result.Add(GetDescription(parkingAreaType));
    }
}