能否将代码中的#region区域作为变量用于日志输出?
结论与解决方案
不行,C#里没法直接用#currentregion这种语法获取当前#region的名称。
原因
#region只是编辑器层面的代码折叠语法糖,编译阶段会被完全剔除,编译后的程序集里不会保留任何关于#region的信息,所以运行时根本无法读取到它的名称。
替代方案
如果你想避免重复手写区域名称、减少冗余代码,可以试试这两种方式:
1. 定义字符串常量复用
把每个区域的名称定义成常量,在catch块里直接引用:
private const string OrdersAndSubOrdersRegion = "Orders and SubOrders"; private const string CustomersRegion = "Customers"; #region Orders and SubOrders try { ... // 清理Orders和SubOrders的代码 } catch (Exception ex) { _logger.Error($"An exception occurred while cleaning [{OrdersAndSubOrdersRegion}]. Error message=[{ex.Message}]"); } #endregion #region Customers try { ... // 清理Customers的代码 } catch (Exception ex) { _logger.Error($"An exception occurred while cleaning [{CustomersRegion}]. Error message=[{ex.Message}]"); } #endregion
2. 封装通用日志清理方法
把清理逻辑和日志逻辑封装成通用方法,将实体名称作为参数传入:
private void ExecuteCleanupWithLogging(string entityName, Action cleanupAction) { try { cleanupAction(); } catch (Exception ex) { _logger.Error($"An exception occurred while cleaning [{entityName}]. Error message=[{ex.Message}]"); } } // 调用示例 #region Orders and SubOrders ExecuteCleanupWithLogging("Orders and SubOrders", () => { ... // 清理Orders和SubOrders的代码 }); #endregion #region Customers ExecuteCleanupWithLogging("Customers", () => { ... // 清理Customers的代码 }); #endregion
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

