如何获取委托所属类的名称?实现无需手动传入加载名称的逻辑
自动从委托获取所属类名替代手动传入名称的解决方案
核心思路
通过委托的Target属性获取其绑定的实例对象,进而拿到所属类的名称,再将类名转换为友好的显示格式,彻底避免手动传入名称参数。
代码实现
1. 重构LoadInitialDataAsync方法
移除原方法的name参数,内部自动完成类名的获取与格式化:
private async Task LoadInitialDataAsync(Func<Task> action) { if (action.Target == null) { // 处理静态方法委托的场景(当前业务场景大概率不会触发) logger.LogTrace("Loading unknown data..."); await action.Invoke(); return; } // 获取委托所属类的原始名称 var className = action.Target.GetType().Name; // 转换为用户示例中的友好格式 var friendlyName = ConvertClassNameToReadableFormat(className); logger.LogTrace($"Loading {friendlyName}..."); await action.Invoke(); }
2. 实现类名转换方法
将帕斯卡命名的类名(如NeighboursMilk)转换为空格分隔的自然语言格式:
private string ConvertClassNameToReadableFormat(string className) { if (string.IsNullOrWhiteSpace(className)) return className; // 在每个大写字母前插入空格(跳过第一个字符) var formattedName = string.Concat( className.Select((char c, int index) => index > 0 && char.IsUpper(c) ? $" {c}" : c.ToString())); // 转换为全小写(可根据需求调整为首字母大写等格式) return formattedName.ToLower(); }
3. 简化调用方式
现在调用时无需手动传入名称,直接传入委托即可:
await LoadInitialDataAsync( serviceProvider.GetRequiredService<NeighboursMilk>().LoadInitialDataAsync); await LoadInitialDataAsync( serviceProvider.GetRequiredService<MyOldSockCollection>().LoadInitialDataAsync); await LoadInitialDataAsync( serviceProvider.GetRequiredService<NewJamesBondDvds>().LoadInitialDataAsync);
补充说明
action.Target仅对实例方法委托有效,若传入静态方法委托,该属性会返回null,可根据实际业务需求补充对应处理逻辑。- 类名转换逻辑可灵活调整,比如保留首字母大写、处理特殊缩写命名等。
内容的提问来源于stack exchange,提问作者user5405648
相关产品推荐
相关产品推荐

