我需要一种优雅的方法来从枚举中提取备用数据

时间:2017-05-04 12:55:28

标签: c# enums compact-framework

我一直在寻找一种从枚举中获取替代值的方法,并引用了这个答案

  

https://stackoverflow.com/a/10986749/5122089

这里它使用description属性来赋值,然后使用一个方法来提取它

public static string DescriptionAttr<T>(this T source) {
   FieldInfo fi = source.GetType().GetField(source.ToString());

    DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute), false);

    if (attributes != null && attributes.Length > 0) return attributes[0].Description;
else return source.ToString(); }

只有我不幸地陷入了.net 3.5 Compact Framework的黑暗时代,并且似乎无法访问System.ComponentModel.DescriptionAttribute

可能有人给我一个提示如何让这样的工作......

1 个答案:

答案 0 :(得分:1)

我不确定这是你在想什么。我刚刚对原始代码进行了一些更改:

static class MyClass
{
    public static string DescriptionAttr<T>(this T source, Type attrType, string propertyName)
    {
        FieldInfo fi = source.GetType().GetField(source.ToString());

        var attributes = fi.GetCustomAttributes(attrType, false);

        if (attributes != null && attributes.Length > 0)
        {
            var propertyInfo = attributes[0].GetType().GetProperty(propertyName);

            if (propertyInfo != null)
            {
                var value = propertyInfo.GetValue(attributes[0], null);
                return value as string;
            }
        }
        else
            return source.ToString();

        return null;
    }
}

public enum MyEnum
{
    Name1 = 1,
    [MyAttribute("Here is another")]
    HereIsAnother = 2,
    [MyAttribute("Last one")]
    LastOne = 3
}

class MyAttribute : Attribute
{
    public string Description { get; set; }

    public MyAttribute(string desc)
    {
        Description = desc;
    }
}

<强>用法:

var x = MyEnum.HereIsAnother.DescriptionAttr(typeof(MyAttribute), "Description");