2016-11-15 12 views
1

Как определить, является ли это типом перечисления с использованием Mono.Cecil ??(C#) Как определить, является ли это типом перечисления с использованием Mono.Cecil?

Легко определить только с помощью Type.IsEnum. Но я не могу найти подобных функций в TypeDefinition ...

Есть ли способ определить?

+1

Там, кажется, 'IsEnum' собственности на' TypeDefinition'. См. [Здесь] (https://github.com/jbevain/cecil/blob/master/Mono.Cecil/TypeDefinition.cs#L408). Если ваша версия не включает это, вы можете написать метод расширения, который делает то же самое, что и источник – Rob

ответ

3

На TypeDefinition находится IsEnum.

О, и, прежде чем задать свой следующий вопрос, вот как вы разобрать строку перечислимую назад это значение INT, используя Сесил ...

int ParseEnum(TypeReference enumRef, string value) 
{ 
    var enumDef = enumRef.Resolve(); 
    if (!enumDef.IsEnum) 
     throw new InvalidOperationException(); 

    int? result = null; 

    foreach (var v in value.Split(',')) { 
     foreach (var field in enumDef.Fields) { 
      if (field.Name == "value__") 
       continue; 
      if (field.Name == v.Trim()) 
       result = (result ?? 0) | (int)field.Constant; 
     } 
    } 

    if (result.HasValue) 
     return result.Value; 

    throw new Exception(string.Format("Enum value not found for {0}", value)); 
}