2013-11-08 2 views
2

Я пытаюсь сгенерировать класс интерфейсов типов с полным перечислением.T4 Получить значение Enum Members

Я зациклился на том, как получить значение члена перечисления.

Enum.Members получает CodeElements, а не CodeProperties, и если я пытаюсь выполнить бросок, он ломается. Он также ломается с CodeEnum.

То, что я пытаюсь сделать, это получить значение так, чтобы оно было явным с value1 = 1, value2 = 2 и т. Д. Вместо значения value1, value2, потому что перечисления могут не основываться на 0.

Любая помощь была бы принята с благодарностью.

+1

Что такое 'CodeEnum'? Какой API? (Я не вижу его в ['System.CodeDom'] (http://msdn.microsoft.com/en-us/library/system.codedom (v = vs.110) .aspx)) –

+0

Я используя taligent t4, поэтому он может быть конкретным, но в любом случае он не работает. Попытка получить определение, которое кажется, что оно может работать, если я могу применить к codeproperty, но я не могу или не знаю, как .. –

ответ

5

«CodeElements» звучит так, как будто вы используете интерфейсы EnvDTE для доступа к вашим перечислениям. Если это так, все элементы перечисления находятся в Members -Процессе типа EnvDTE.CodeEnum. Они имеют тип EnvDTE.CodeVariable, а явное значение сохраняется в переменной InitExpression.

Посмотрите на этот Enum:

// C# Enum to reflect 
    public enum MyEnum { Hi = 10, There = 15 } 

И этот T4 CodeSnippet отражающую Enum:

<# 
     // the enumeration object you already seem to have 
     EnvDTE.CodeEnum theEnum; 

     // iterate all enumeration items 
     foreach(EnvDTE.CodeVariable variable in theEnum.Members) 
     { 
      // render name and value 
      #><#= variable.Prototype #> = <#= variable.InitExpression.ToString() #> 
    <#} 
    #> 

должно привести:

Hi = 10 
    There = 15 

Надежда, что помогает.

+0

Спасибо! Прекрасно работает! –

+0

Это не работает, когда член перечисления назначается из другого выражения, например. 'enum Foo {Bar = 1, Baz = Bar + 1}' скажет 'Baz: Bar + 1'. – Dai

Смежные вопросы