You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取委托所属类的名称?实现无需手动传入加载名称的逻辑

自动从委托获取所属类名替代手动传入名称的解决方案

核心思路

通过委托的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:52:46