调试时是否可以声明 C# 方法/函数?

Is it possible to declare C# method / function while debugging?

假设您设想了一些扩展方法,可以将对象以某种方式转换为对调试有用的东西。一个例子是 sqlCommand.ToScript() 扩展方法,它将 return T-SQL 脚本版本的字符串执行(它会在脚本顶部声明参数等) .) 您希望该扩展方法(或至少某些函数/方法)在调试时可用,但您不想在您的代码库中实际定义它,因为它会让团队感到混乱。

我认为Immediate Window 不能定义函数,可以吗?有 C# Interactive Window,但它可以在我遇到断点后与当前正在执行的堆栈进行交互吗?

我听说 Reflection.Emit() 可以在 运行 时添加新代码。我能以某种方式使用它吗?

除了扩展 Immediate Window 或者为 VS 创建新的扩展,我可以想到以下解决方案让你有一些调试方法:

  • 使用#if DEBUG + 部分 类 或扩展方法
  • 使用条件引用+扩展方法
  • 在即时 Window + 扩展方法中使用 Assembly.Load

我将分享上述每个解决方案的示例。

使用#if DEBUG + 部分 类 或扩展方法

您可以使用 #if DEBUG。对于代码库中的类型,您可以使用部分 classes 将调试方法分组到 class 的其他部分,如下所示:

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
}

使用条件引用+扩展方法

如果您想将所有这些代码放在不同的库中,您可以创建一个 class 库并将扩展名 classes 放在全局命名空间(无命名空间)中,然后添加一个条件参考:

<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!";
    }
}

在即时 Window + 扩展方法中使用 Assembly.Load

作为另一种选择,您可以创建另一个程序集,然后将这些扩展方法放在该程序集中的全局命名空间(无命名空间)中。然后不添加引用,只是在调试时,立即 window 你可以使用它们:

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

在这个解决方案中,你不需要调试,你也不需要任何添加引用,它只在调试时和立即可用window:

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

您不会立即获得它的智能感知 Window,但它有效。