Предполагая, что у вас есть конечный предопределенный набор текстовых литералов, который меняется не часто , вы можете просто сгенерировать перечисление (или даже класс строковых констант), используя, например, шаблоны T4
, и используйте это как:
DataFactory.Name(Tickers.ATVI).Price(50)
Это был бы подход, который лучше всего соответствует семантике проблемы и возможностям языка C # и инструментов.
Кстати, этот метод цепочки, который вы планируете использовать, представляет собой комбинацию шаблона компоновщика и плавного интерфейса , , см. Пример в c #
Если вы все еще хотите скрыть это как вызов метода, у вас есть несколько вариантов:
- Предварительно - Создайте список методов, используя
T4
шаблоны в частичном классе или в качестве методов расширения для вашей фабрики данных. Вы можете выбрать список литералов из своего хранилища данных внутри шаблона T4
. Это довольно распространенный подход. Поскольку у вас будут предварительно сгенерированные методы, itellisence будет работать с этим подходом. Узнайте больше о T4
- Используйте
DLR
и dynamic
. Это откладывает поиск метода до времени выполнения, и вы можете создать собственный динамический объект, который будет принимать любой вызов метода, а затем взять имя этого метода и передать его в качестве аргумента вашему Name
методу. Intellisence не будет работать с этим подходом, поскольку у вас нет метаданных в сборке относительно ваших методов. Как создать динамический объект
- Используйте
dynamic
и дополнительно создайте расширение intellisence, см. Пользовательское расширение Intellisense для получения более подробной информации
Вы можете пойти еще дальше, написать анализатор Roslyn
и установить его в своей Visual Studio, чтобы иметь автоматические исправления кода от DataFactory().Name("ATVI")
до DataFactory().ATVI()
, то есть - если у вас есть время / ресурсы. Посмотрите пример анализатора кода
Как всегда, ответ "это зависит", и контекст - это все, поэтому трудно сказать, какое решение будет лучшим для вас.
Я предпочел бы пойти на самый простой 1), особенно учитывая сложность и стоимость обслуживания 2) и 3)
Пожалуйста, дайте мне знать, если вам нужна более подробная информация о любом из вариантов
Надеюсь, это поможет!