Получить исходный код класса

Несколько месяцев назад я написал небольшой скрипт Use-ClassAccessors, чтобы упростить определение методов доступа к классам (геттеров и сеттеров). Это работает очень хорошо, за исключением небольшого ограничения: сценарий Use-ClassAccessors необходимо вызывать из файла сценария, в котором находится соответствующий класс, чтобы он мог загрузить связанную AST информацию о классе. Неприятный побочный эффект заключается в том, что средства доступа не всегда перезагружаются в модуле¹, над которым я работаю с VSCode. Обходной путь — использовать Kill Terminal и загрузить новый.

  1. Модуль psd1 также вызывает скрипт, содержащий класс и функцию Use-ClassAccessors с ScriptsToProcess, но он, очевидно, не перезагружается, когда в сам класс вносятся изменения.

Я подозреваю, что смогу решить эту проблему, если смогу запустить функцию Use-ClassAccessors из статического конструктора, как описано здесь.

Дело в том, что я понятия не имею, как мне добраться до исходного кода (AST) самого класса.

Другими словами:
Есть ли способ получить собственный ScriptBlock класса из соответствующего класса, аналогично тому, как я мог бы сделать это в функции:

function GetMyCode {
    Write-Host 'My Source Code:'
    $MyInvocation.MyCommand.ScriptBlock
}

Я не думаю, что для этого вообще нужен доступ к AST — всю необходимую информацию можно извлечь с помощью отражения :)

Mathias R. Jessen 21.02.2024 12:27

@MathiasR.Jessen, хорошая мысль, мне нужно кое-что подумать.

iRon 21.02.2024 12:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, это проблема XY: на самом деле вам не нужен доступ к исходному коду (или результирующему AST) для обнаружения необходимой информации, вы можете получить ее из результирующего типа во время выполнения:

$targetType = $ClassName -as [Type]

if ($targetType.Assembly.GetName().Name -notmatch 'PowerShell Class Assembly') {
  # not a powershell class 
  return
}

$accessorMethods = $targetType.GetMethods() |? Name -Like "?et_${PropertyName}"

Большое спасибо, я провел несколько быстрых тестов, и действительно похоже, что вся необходимая информация доступна из «статического конструктора» (мне нужно еще немного времени, чтобы переписать мою функцию). @mklement0, этот ответ является хорошим (противным) примером: Что не так с моим ответом?мета-проблема.

iRon 21.02.2024 13:47

@iRon Рад помочь! FWIW «статический конструктор» имеет особое значение во многих .NET-языках (в C# он обычно описывает явный статический инициализатор) — $targetType — это просто экземпляр типа [type] :)

Mathias R. Jessen 21.02.2024 13:52

Другие вопросы по теме