none
C# + T4 + Visual Studio 2017 :: Генерация класса на основе атрибутов метода др. класса RRS feed

  • Общие обсуждения

  • У нас есть некая система, которая позволяет хостить некоторые задания. Аналог Task Scheduler Windows.

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

    Настройки задания определяются специфическими атрибутами метода-задания.

    Для получения настроек задания в момент запуска необходимо обращаться к единственному параметру метода-задания, в котором есть Dictionary [название атрибута метода] -> [значение].

    Сейчас на рутину в виде получения параметров задания тратиться очень много времени. Хотелось бы сделать некий "помощник", который бы мониторил классы в проекте с конкретным родительским классом, считывал из него методы-задания и на основе атрибутов метода формировал класс со свойствами. На ум приходит Т4, но вот как это можно сделать?

    Я с Т4 можно сказать не работал и даже не знаю в какую сторону копать. Поделитесь знаниями!

    Возможно я не очень понятно написал поэтому прикладываю c# код.

    Как сейчас:

    public class Tasks : TaskContainer
        {
            public Tasks()
            {
                _actions.Add(Task1);
            }
    
            [Description("Description of Test method")]
            [StringParam("StringParam1")]
            [IntParam("IntParam1")]
            ...
            public void Task1(TaskContext taskContext)
            {
                var stringParam1Value = (string)taskContext.ParamValues["StringParam1"];
                var intParam1Value = (int)taskContext.ParamValues["IntParam1"];
                ...
            }
        }

    Примерный вид того что хотелось бы получить:

    Класс-помощник с настройками задания:

    internal class Task1ParamValues
        {
            public string StringParam1 { get; }
            public int IntParam1 { get; }
            ...
    
            public Task1ParamValues(TaskContext taskContext)
            {
                ...
            }
        }

    Предыдущий код с учетом класса-помощника:

    public class Tasks : TaskContainer
        {
            public Tasks()
            {
                _actions.Add(Task1);
            }
    
            [Description("Description of Test method")]
            [StringParam("StringParam1")]
            [IntParam("IntParam1")]
            ...
            public void Task1(TaskContext taskContext)
            {
                var taskSettings = new Task1ParamValues(taskContext);
                //taskSettings.StringParam1;
                //taskSettings.IntParam1;
    
            }
        }

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


    28 июня 2018 г. 11:55