用Dictionary或smth替换DescriptionAttr

时间:2015-02-17 13:20:51

标签: asp.net .net

我有一个枚举,其中包含描述属性(用于审计):

public enum ActivityType
{
    [NotExist("Not Assign")]
    [Description("Change Level")]
    LevelChanged,

    [NotExist("Not Assign")]
    [Description("Change Skill Level")]
    SkillLevelChanged
 }

所有这些都很棒,直到我需要将Desription放入资源文件(属性不支持它们),所以我需要Dictionary或类似的东西。问题是:如何实现此功能而不会在所有其他逻辑中发生重大变化这样的事情:

private static readonly Dictionary<ActivityType, String> ActivityDescription = new Dictionary<ActivityType, String>()
    {
        {ActivityType.LevelChanged, "Change"},
        {ActivityType.SkillLevelChanged, "SkillChange"}
    }

1 个答案:

答案 0 :(得分:1)

需要最少量代码更改的解决方案是将描述更改为资源文件中的资源键。然后,您可以通过执行以下操作动态地阅读这些内容:

[Description("Change_Level")]

然后您的资源键/值将是:

Change_Level             Change Level

要阅读它,你可以这样做:

FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute attribute = value.GetType()
        .GetField(value.ToString())
        .GetCustomAttributes(typeof(DescriptionAttribute), false)
        .SingleOrDefault() as DescriptionAttribute;

if (attribute != null)
{
    var resManager = new ResourceManager(typeof(MyResources));
    return resManager.GetString(attribute.Description);
}
else
{
    return value.ToString();
}

如果您想要一个更好的解决方案并且可以选择传入资源文件,那么您可以劫持Display属性:

[Display(ResourceType = typeof(MyResources), Name = "Change_Level")]

然后你可以这样做:

FieldInfo fi = value.GetType().GetField(value.ToString());
DisplayAttribute attribute = value.GetType()
        .GetField(value.ToString())
        .GetCustomAttributes(typeof(DisplayAttribute), false)
        .SingleOrDefault() as DisplayAttribute;

if (attribute != null)
{
    var resManager = new ResourceManager(attribute.ResourceType);
    return resManager.GetString(attribute.Name);
}
else
{
    return value.ToString();
}