Можно ли объявить C# метод / функцию при отладке? - PullRequest
1 голос
/ 07 февраля 2020

Допустим, вы представляете какой-то метод расширения, который каким-то образом преобразует объект во что-то полезное для целей отладки. Одним из примеров является метод расширения sqlCommand.ToScript(), который будет возвращать строку версии сценария T- SQL того, что он собирается выполнить (он объявит параметры в верхней части сценария и т. Д. c.). например, этот метод расширения (или, по крайней мере, какая-то функция / метод) будет доступен во время отладки, но вы не хотите фактически определять его в своей базе кода, так как это будет похоже на беспорядок в команде.

Я не думаю, что Immediate Window может определять функции, не так ли? Существует интерактивное окно C#, но может ли оно взаимодействовать с текущим выполняемым стеком после того, как я достиг точки останова?

Я слышал, что Reflection.Emit () может добавлять новый код во время выполнения. Могу ли я использовать это как-то?

1 Ответ

2 голосов
/ 07 февраля 2020

Помимо расширения Immediate Window или создания нового расширения для VS, я могу подумать о следующих решениях, которые позволят вам использовать несколько методов отладки:

  • Использование #if DEBUG + Partial Classes или Methods Extension
  • Использование условных ссылок + методов расширения
  • Использование Assembly.Load в Immediate Window + Методы расширения

Я поделюсь примером для каждого из приведенных выше решений.

Использование #if DEBUG + Частичные классы или методы расширения

Вы можете использовать #, если DEBUG . Для типов в вашей кодовой базе вы можете сгруппировать методы отладки в другие части вашего класса, используя частичные классы, например:

public partial class MyClass
{
#if DEBUG
    public string SaySomething()
    {
        return "Something!";
    }
#endif 
}

Для типов, которые вам не принадлежат, вы можете использовать методы расширения вот так (вы также можете использовать это решение для типов, которые вам принадлежат):

public static class SqlCommandExtensions
{
#if DEBUG
    public static string SaySomething(this SqlCommand command)
    {
        return "Something!";
    }
#endif
}

Использование условных ссылок + методов расширения

Если вы хотите поместить весь этот код в В другой библиотеке вы создаете библиотеку классов и помещаете классы расширения в глобальное пространство имен (без пространства имен), а затем добавляете условную ссылку:

<ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
  <Reference Include="GlobalExtensions">
    <HintPath>..\Somewhere\GlobalExtensions.dll</HintPath>
  </Reference>
</ItemGroup>

В этом решении вам не требуется отладка.

public static class SqlCommandExtensions
{
    public static string SaySomething(this SqlCommand command)
    {
        return "Something!";
    }
}

Использование Assembly.Load в Immediate Window + Методы расширения

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

Assembly.LoadFile(@"C:\Somewhere\GlobalExtensions.dll")
yourSqlCommand.SaySomething()

В этом решении вам не нужна отладка, вам также не нужна ссылка на добавление и он доступен только во время отладки и в ближайшем окне:

public static class SqlCommandExtensions
{
    public static string SaySomething(this SqlCommand command)
    {
        return "Something!";
    }
}

У вас не будет смысла для него в непосредственном окне, но он работает.

...