VMesser
@VMesser
gitter.im/VBA-developers

Как преобразовать в строку последовательность вызываемых вложенных классов?

Сразу опишу сверхзадачу, может я изначально иду не по тому пути.
Пишу телеграм-бота, есть дерево меню. Коллбеки на кнопках решил описать в некой регулярной форме: код_меню/код_кнопки.
Во имя искусства пришла идея не писать строковые константы в коллбеки, а организовать некое вложенное перечисление, которое будет отражать дерево меню и кнопок. Так как Enum вложенности не поддерживает, пошёл по советам из гугла: использовать вложенные классы.

Допустим у меня есть класс Foo, вложенный в него класс Bar, а в Bar - статическое поле Baz. Хочется вызов Foo.Bar.Baz преобразовать в строку вида "Foo.Bar.Baz".
Есть решение в лоб: каждому полю Baz сразу давать значение вида "Foo.Bar.Baz".

Однако хочется сделать что-то более красивое и гибкое. Унаследовать, например Foo или Bar или Baz от какого-нибудь класса, метод которого будет возвращать этот "путь". Как это можно организовать?
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
freeExec
@freeExec
Участник OpenStreetMap
Если это классы действительно вложенные, а не как ты тут описался "унаследованные", то через рефлексию можно получить полное название класса и оно будет похоже на namespace.MainClass+ChildClass1+ChildClass2

Но имхо, ты создаёшь себе проблемы на пустом месте.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
VoidVolker
@VoidVolker
В вашем случае вам нужен словарь. Например:
Dictionary<string, Action> index = new Dictionary<string, Action>();
index["a.b.c"] = () => Console.WriteLine("a.b.c");
index["a.b.c"]();

Если хочется именно через классы - то вместо делегата легко можно использовать экземпляр любого нужного класса. Если хочется вот прям совсем красиво и именно дерево, то в классе опять же создаете словарь и перегружаете индексатор, чтобы он разбивал строку по разделителям и осуществлял поиск дальше вглубь дерева. И тогда можно будет делать что-то типа такого:
var tree = new MyTree() { 
    {
        "a",  new MyTree() { 					
            {
                "b", new MyTree(() => Console.WriteLine("a.b.c"))
            }					
        }
    }
}
tree["a.b"]();

И да, как уже сказали ранее - можно и через рефлексию, но зачем, если есть словари и они проще и работают из коробки?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы