2015-03-01 1 views
0

Это мой файл класса.Загрузить все перечисления из файла класса. Dynamically

public class GetValuesTest { 
enum Color { Red, Green, Blue, Yellow }; 
enum Styles { Plaid = 0, Striped = 23, Tartan = 65, Corduroy = 78 }; 

public static void Main() { 

    Console.WriteLine("The values of the Colors Enum are:"); 
    foreach(int i in Enum.GetValues(typeof(Colors))) 
     Console.WriteLine(i); 

    Console.WriteLine(); 

    Console.WriteLine("The values of the Styles Enum are:"); 
    foreach(int i in Enum.GetValues(typeof(Styles))) 
     Console.WriteLine(i); 
} 

}

Вместо жесткого кодирования объектов перечислений как Enum.GetValues ​​(TYPEOF (Colors)) и стили, которые я хочу, чтобы загрузить все перечислений динамически во время выполнения и получить их значения. Пожалуйста, помогите

+5

Что означает «загрузить динамически»? –

+0

отредактировал вопрос. –

+0

Используйте отражение. –

ответ

1

Я попытался сделать это с помощью отражения, и это вполне возможно. Хотя код не очень аккуратный и красивый. Я уверен, что его можно улучшить, чтобы повысить качество продукции. В любом случае, ниже класс я объявил с перечислениями:

public class TestingEnums 
    { 
     public enum Color { Red, Blue, Yellow, Pink } 

     public enum Styles { Plaid = 0, Striped = 23, Tartan = 65, Corduroy = 78 } 

     public string TestingProperty { get; set; } 

     public string TestingMethod() 
     { 
      return null; 
     } 
    } 

Я создал событие кнопки WinForms для извлечения каждого значения его перечислений. Ниже приведен код обработчика событий, в котором отображается каждый член перечисления в строке.

private void btnTest_Click(object sender, EventArgs e) 
     { 

      var t = typeof (TestingEnums); 
     var nestedTypes = t.GetMembers().Where(item=>item.MemberType == MemberTypes.NestedType); 
     foreach (var item in nestedTypes) 
     { 
       var type = Type.GetType(item.ToString()); 
       if (type!=null && type.IsEnum) 
       { 
        string items = " "; 
        foreach (MemberInfo x in type.GetMembers()) 
        { 
         if (x.MemberType == MemberTypes.Field) 
         { 
          if (!x.Name.Equals("value__")) 
          { 

           items = items + (" " + Enum.Parse(type, x.Name)); 

           items = items + (" " + (int)Enum.Parse(type, x.Name)); 
          } 
         } 
        } 
        MessageBox.Show(items); 
       } 

     }      
      } 
     } 

P.S. Я уверен, что мы можем сделать что-то лучше, чем строка, чтобы избавиться от поля value__.

+0

это хорошо выглядит. Но могу ли я получить значения перечисления, если они доступны? –

+0

Я получаю имя участника, но также нужно значение члена. –

+0

Да, вы можете. Я только что изменил код, чтобы дать вам имя участника и значения обоих. Пожалуйста, примите его как ответ, если это поможет :) –

0

Вам нужно будет использовать шаблонный метод или функцию. Подобно «открытому кронштейну» T «закрыть кронштейн». Затем компилятор во время компиляции перечислил бы перечисляемый вами enumType.

Однако теперь у вас есть тип перечислимого типа, закодированный в внешний код вызова.

Пункт Enum заключается в том, чтобы зафиксировать тип во время кода/компиляции. Пожалуйста, рассмотрите ваш прецедент, так как вам может не потребоваться перечисление вообще, а пара ключевых значений, которая больше похожа на данные.

(бит больше ..) Итак, в вашем случае вы загрузите перечисления цветов в массив или список. Для .NET они являются перечислениями цвета - вам во время выполнения они представляют собой список/массив допустимых вариантов цвета для вашего приложения, поэтому вы помещаете их в переменную времени выполнения типа списка типов цветов. Типы списков и массивов позволяют хранить и ссылаться на то, как вам нужно во время выполнения для вашего приложения. Ваше приложение использует встроенный диапазон типов перечислений в виде массива, но это не значит, что тип перечисления должен был поддерживать.

+0

У меня есть это требование, когда мне нужно загрузить эти перечисления только в этом .cs-файле. Я не беспокоюсь о других перечислениях в других файлах .cs. –

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