2010-05-22 1 views
0

У меня есть список строк, которые являются кандидатами на значения Enumerations. ОниСоздание DescriptionAttribute на поле перечисления с использованием System.Reflection.Emit

  • Не отсылайте Diffs
  • 500 линий
  • 1000 линий
  • 5000 линий
  • Отправить Целые Diff

Проблема состоит в том, что пробелы, специальные символы не являются часть идентификаторов и даже не может начинаться с числа, поэтому я буду дезинфицировать эти значения только с символами, цифрами и _

Чтобы сохранить исходные значения, я думал положить эти строки в 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 
} 

Тогда позже с помощью кода я получить реальную строку, связанную со значением перечисления, так что правильная строка может быть отправлена ​​обратно веб-службе, чтобы получить правильный ресурс.

Я хочу знать, как создать DescriptionAttribute с помощью System.Reflection.Emit

В основном речь идет о том, где и как хранить исходную строку, так что при выборе значения перечисления, соответствующее значение может быть восстановлено ,

Мне также интересно узнать, как получить доступ к DescriptionAttribute при необходимости.

+0

Почему вы спрашиваете об использовании relection.emit для добавления атрибутов, то есть добавления атрибутов во время выполнения? В приведенном выше примере вы добавили атрибуты в код напрямую. –

+0

Я имею в виду, я хочу что-то вроде этого. Если вы создаете проект, содержащий этот раздел кода, он должен быть таким же, как тот, который был создан с помощью Reflection.Emit –

+0

Я обновил свой ответ. –

ответ

2

Хорошо, если вы действительно хотите использовать отражение:

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); 

$> Не отсылайте

посмотреть различия

Очевидно, что нет обработки ошибок и т.д., но основная идея есть.

Update

теперь я думаю, что я вижу смысл вашего вопроса, который сам и другие люди, которые на самом деле отвеченных пропустили.

Вы хотите украсить enum атрибутами во время выполнения, т. Е. Добавить атрибуты к типу во время выполнения. Добавление атрибутов к типу во время выполнения: не возможно.

Однако это поддержка в.Net для двигателя метаданных типа с помощью: TypeDescritor:

MSDN http://msdn.microsoft.com/en-us/library/system.componentmodel.typedescriptor.aspx

Пример http://geekswithblogs.net/abhijeetp/archive/2009/01/10/dynamic-attributes-in-c.aspx

Структура TypeDescritor позволяет динамически предоставлять информацию о типе, а не на самом деле динамически декорирования типов напрямую - это слой косвенности.

Возможно, вы сможете согнуть этот механизм, чтобы поддерживать то, что вы хотите сделать, но в конце дня вам нужно будет поддерживать поиск членов перечисления, чтобы предоставить строки описания. Использование структуры поиска для поддержания отображения между членами Ваших перечислений и строкой описания были мой первый ответ и первый ответ на этот вопрос ...

+0

Спасибо! Это для доступа к атрибутам, но я все еще не могу найти способ добавления атрибутов. –

+0

Я думаю, что все неправильно поняли ваш вопрос. Код перечисления в вопросе уже имеет применяемые атрибуты. Вы хотите добавить атрибуты во время выполнения? –

+0

Плюс, если вам нравится ответ до сих пор, голосование может мотивировать ... :) –

0

Вы можете написать общий метод, как это:

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; 
    } 
}