繁体   English   中英

使用System.Reflection.Emit在枚举字段上创建DescriptionAttribute

[英]Creating DescriptionAttribute on Enumeration Field using System.Reflection.Emit

我有一个字符串列表,这些字符串是Enumerations值的候选者。 他们是

  • 不要发送差异
  • 500线
  • 1000线
  • 5000线
  • 发送整个差异

问题是空格,特殊字符不是标识符的一部分,甚至不能以数字开头,因此我将把这些值消毒为仅char,数字和_

为了保留原始值,我想到了将这些字符串放入DescriptionAttribute中,以使最终的Enum看起来像

public enum DiffBehvaiour
{ 
    [Description("Don't send diffs")]
    Dont_send_diffs,
    [Description("500 lines")]
    Diff_500_lines,
    [Description("1000 lines")]
    Diff_1000_lines,
    [Description("5000 lines")]
    Diff_5000_lines,
    [Description("Send entire diff")]
    Send_entire_diff
}

然后,稍后使用代码,我将检索与枚举值关联的实际字符串,以便可以将正确的字符串发送回Web服务以获得正确的资源。

我想知道如何使用System.Reflection.Emit创建DescriptionAttribute

基本上,问题是在何处以及如何存储原始字符串,以便在选择Enumeration值时可以检索到相应的值。

我也想知道如何在需要时访问DescriptionAttribute

好的,如果您真的想使用反射:

DiffBehvaiour value = DiffBehvaiour.Dont_send_diffs;

FieldInfo enumField = value.GetType().GetField(value.ToString());

DescriptionAttribute attribute = (DescriptionAttribute)enumField.
    GetCustomAttributes(typeof(DescriptionAttribute), true)[0];

Console.WriteLine(attribute.Description);

$>不要发送差异

显然没有错误处理等,但是基本思想就在那里。

更新

我现在认为我明白了您的问题的要点,我本人和其他回答者实际上都没有理会。

您想在运行时用属性修饰枚举,即在运行时将属性添加到类型。 无法在运行时将属性添加到类型。

但是,.Net通过以下类型为类型元数据引擎提供以下支持: TypeDescritor

MSDN http://msdn.microsoft.com/zh-CN/library/system.componentmodel.typedescriptor.aspx

示例http://geekswithblogs.net/abhijeetp/archive/2009/01/10/dynamic-attributes-in-c.aspx

TypeDescritor框架允许您动态提供类型信息,而不是实际直接动态修饰类型-它是一个间接层。

您也许可以改变这种机制来支持您想要做的事情,但是最终,您将需要维护枚举成员的查找以提供描述字符串。 使用查找结构维护枚举成员和描述字符串之间的映射是我的第一个答案,也是对此问题的第一个答案...

您可以编写这样的通用方法:

class EnumExtensions
{
     public static string GetDescription<TEnum>(TEnum value)
         // inexpressible generic constraint TEnum : System.Enum
     {
         // reflection lookup of this value per @chibacity answer
     }

     public static IDictionary<TEnum,string> GetDescriptions<TEnum>()
         // inexpressible generic constraint TEnum : System.Enum
     {
         // do the reflection lookups once and build a dictionary
         var result = new Dictionary<TEnum, string>();

         foreach(string name in Enum.GetNames(typeof(TEnum))
         {
             var value = (TEnum)Enum.Parse(typeof(TEnum), name);
             var description = GetDescription(value);

             result.Add(value, description);
         }

         return result;
     }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM