Использование структуры в качестве расширенного типа перечисления и попытка доступа к свойствам по индексу - PullRequest
0 голосов
/ 29 мая 2020

Я следовал этому руководству по созданию более сложного типа перечисления для моей реализации. http://www.huristic.co/blog/2018/1/30/c-advanced-enum-value-types

Пока все хорошо, однако теперь мне нужно получить доступ к свойствам структуры, которые я сделал идеально по индексу. Пример использования: если я попал в список целых чисел, я хочу иметь возможность предоставить список строк с сезонами, например, {1,4,7} даст мне {"Winter", "Spring", " Лето "}, например.

Фактически, используя этот пример, я хотел бы иметь возможность выбрать Месяц, где, например, индекс равен 7, и выйти из сезона« Лето ».

Моим первым шагом было получить такие имена:

IEnumerable<string> names = typeof(Month).GetProperties(BindingFlags.Static | BindingFlags.Public)
.Select(x => x.Name);

Затем я попытался получить конкретный месяц с помощью:

foreach(string name in names) { 
  Month m = (Month) typeof(Month).GetType().GetProperties()
  .Single(info => info.Name == name)
  .GetValue(typeof(Month),null);
}

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

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

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Альтернативный подход, если вы все еще хотите использовать Enums в течение месяцев, - это создать класс расширения:

public enum Month
{
    January = 1,
    February = 2,
    March = 3,
    April = 4,
    May = 5,
    June = 6,
    July = 7,
    August = 8,
    September = 9,
    October = 10,
    November = 11,
    December = 12
}

public static class MonthExtensions
{
    private static readonly Dictionary<int, string> _seasons = new Dictionary<int, string>
    {
        {1, "Spring" },
        {2, "Summer" },
        {3, "Autumn" },
        {4, "Winter" }
    };

    private static readonly Dictionary<int, string> _names = new Dictionary<int, string>
    {
        {1,  "January"},
        {2,  "February"},
        {3,  "March"},
        {4,  "April"},
        {5,  "May"},
        {6,  "June"},
        {7,  "July"},
        {8,  "August"},
        {9,  "September"},
        {10, "October"},
        {11, "November"},
        {12, "December"}
    };

    private static readonly Dictionary<int, int> _seasonMap = new Dictionary<int, int>
    {
        {1,  4},
        {2,  4},
        {3,  1},
        {4,  1},
        {5,  1},
        {6,  2},
        {7,  2},
        {8,  2},
        {9,  3},
        {10, 3},
        {11, 3},
        {12, 4}
    }; 

    public static string GetSeason(int monthIndex)
        => ((Month)monthIndex).Season();

    public static IEnumerable<string> GetSeasons(IEnumerable<int> monthIndexes)
        => monthIndexes.Select(i => GetSeason(i));

    public static string Season(this Month month)
        => _seasons[_seasonMap[Index(month)]];

    public static int Index(this Month month)
        => (int)month;

    public static string Name(this Month month)
        => _names[Index(month)];
}
0 голосов
/ 29 мая 2020

Вы можете использовать словарь stati c, чтобы связать месяцы с их индексом:

public sealed class Month
{
    private static Dictionary<short, Month> instances = new Dictionary<short, Month>();

    private static Month AddInstance(string name, short index, string season)
    {
        instances[index] = new Month(name, index, season);
        return instances[index];
    }

    public static IEnumerable<Month> GetByIndex(params short[] indices)
    {
        return indices.Select(i => instances[i]);
    }

    public static readonly Month January = AddInstance("January", 1, "Winter");
    public static readonly Month February = AddInstance("February", 2, "Winter");
    public static readonly Month March = AddInstance("March", 3, "Spring");
    // ...

    public string Name { get; private set; }
    public short Index { get; private set; }
    public string Season { get; private set; }

    private Month(string name, short index, string season)
    {
        Name = name;
        Index = index;
        Season = season;
    }
}

Затем введите:

Month.GetByIndex(1, 4, 7)
    .Select(month => month.Season); // { "Winter", "Spring", "Summer" }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...