Метод для заполнения списка <string>значениями констант класса. C# - PullRequest
7 голосов
/ 22 января 2020

Мне нужно создать метод, который позволит мне заполнить List<string> значениями констант, которые определены в собственном классе.

Чтобы дать вам быстрый пример многочисленных (20 всего) const муравьев, определенных в классе:

private const string NAME1 = "NAME1";
private const string NAME2 = "NAME2";
private const string NAME3 = "NAME3";
...

Как видите, имя константы равно ее значению, если это может помочь.

Пока что, рассматривая примеры различных типов решений, которые я нашел в StackOverflow по поводу похожих проблем, я пришел к следующему:

public static List<string> GetConstantNames()
{
   List<string> names = new List<string>();
   Type type = typeof(ClassName);

   foreach (PropertyInfo property in type.GetType().GetProperties())
   {
      names.Add(property.Name);
   }

   return names;
}

Мой опыт работы программистом довольно низкий, как и мой опыт работы с C #; Я не уверен, если type.GetType().GetProperties() ссылается на имена констант, то же самое происходит со строкой property.Name.

Этот метод делает то, что я спрашиваю?

1 Ответ

11 голосов
/ 22 января 2020

Чтобы получить const s, вы должны оперировать полями , а не свойствами :

  using System.Linq;
  using System.Reflection;

  ...

  public static List<string> GetConstantNames() {
    return typeof(ClassName)
      .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static)
      .Where(fi => fi.IsLiteral && !fi.IsInitOnly) // constants, not readonly
      .Where(fi => fi.FieldType == typeof(string)) // of type string
      .Select(fi => fi.Name) 
      .ToList();
  } 

Если вы хотите получить оба const имена и значения:

  public static Dictionary<string, string> GetConstantNamesAndValues() {
    return typeof(ClassName)
      .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static)
      .Where(fi => fi.IsLiteral && !fi.IsInitOnly) // constants, not readonly
      .Where(fi => fi.FieldType == typeof(string)) // of type string
      .ToDictionary(fi => fi.Name, fi => fi.GetValue(null) as String); 
  } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...