c# - 在编译之前将代码插入到 C# 方法中

标签 c# .net reflection compilation roslyn

我有几个方法是从 WinForms 应用程序的入口点调用的。这些方法依次调用其他方法,有时还会相互调用。

在每个方法的入口处,我都插入了如下代码:

public static bool IsDebug
{
    #if (DEBUG)
        return (true);
    #else
        return (false);
    #endif
}

public void SomeMethod ()
{
    if (IsDebug) { Logger.WriteMethodTrace(MethodBase.GetCurrentMethod().Name); }
}

这种方法有两个问题:

  • 在每个方法中都是手写的。
  • 它使用反射,对于频繁调用的方法来说太慢了。

.
反射(reflection):新的 C# nameof(parameter) 关键字非常适用于参数名称,但我还没有找到类似的方法名称结构。我考虑过创建某种静态字典来保存 TypeMethodInfo 详细信息,但似乎没有办法在运行时提取方法名称而无需反射以用作查字典。

手动编写:即使有避免反射的解决方案,每个方法都需要手动更改,这既乏味又容易出错。我想知道是否有一种方法可以在编译之前及时插入一行代码。不确定是 VS 扩展还是 Roslyn 会在这里提供帮助。理想情况下,如果可以自动插入,则插入应该在不实际修改源代码的情况下进行。

请注意,分析堆栈跟踪不是一种选择。我一直沿着那条路走下去,它缓慢而且令人不快。

如有任何指点/建议,我们将不胜感激。

最佳答案

C# 5.0 为您提供了一项不错的功能。我认为这对您来说很有用:

[Conditional("DEBUG")]
public void LogMethodNameInDebug(
    [CallerMemberName] string memberName = "",
    [CallerFilePath] string sourceFilePath = "", 
    [CallerLineNumber] int sourceLineNumber = 0)
{
    Logger.WriteMethodTrace(memberName);
)


public void SomeMethod()
{
    LogMethodNameInDebug(); // don't fillin the methodnames yourself, the compiler will do.
}

[Conditional("DEBUG")] 将在将其编译为 Release 构建时排除该方法。查找更多信息:MSDN - ConditionalAttribute

[CallerMemberName] 将在编译时填充(它填充调用方的参数,因此不使用反射或堆栈分析)。更多关于 [CallerMemberName] 的信息:MSDN - CallerMemberNameAttribute

关于c# - 在编译之前将代码插入到 C# 方法中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37742733/

相关文章:

c# - 使用 Installutil 安装服务

c# - 遍历对象的属性并获取 DateTime 类型属性的值

c# - 枚举字符串属性时出现 TargetParameterCountException

c# - 在 C# 中手动解码 OAuth 不记名 token

C# 使用 REST API 连接到 Azure 媒体服务帐户

c# - .Net Rest Web 服务响应具有默认的数据协定命名空间而不是预期的命名空间

c# - 出于验证目的迭代方法的参数

reflection - 如何在 Kotlin 数据类字段上列出(java)注释?

c# - 连接池错误 LINQ to SQL

C# 等效的 java 代码