You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

4.2 KiB

LogModelGuess 方法修复总结

修复内容

1. 集成 LogsManager 获取层配置

问题: 原 C# 版本中的 LogModelGuess 方法使用了硬编码的层配置,与 JavaScript 版本不一致。

修复:

  • LogsManager 类中添加了 GetLayerConfig() 方法
  • 修改 LTEClient.LogModelGuess() 方法,从 LogsManager 获取层配置
  • 确保层配置与 JavaScript 版本保持一致

2. 修复方向配置处理

问题: 原版本使用反射获取 dir 属性,但处理逻辑与 JavaScript 版本不一致。

修复:

  • 使用反射正确获取层配置中的 dir 属性
  • 按照 JavaScript 版本的逻辑过滤模型:
    // 移除不支持的模型(与 JavaScript 版本逻辑一致)
    for (int j = 0; j < modelList.Count; j++)
    {
        var model = modelList[j];
        if (!dir.ContainsKey(model))
        {
            var idx = availableModels.IndexOf(model);
            if (idx >= 0)
                availableModels.RemoveAt(idx);
        }
    }
    

3. 修复模型设置逻辑

问题: 原版本的模型设置条件过于严格,与 JavaScript 版本不一致。

修复:

  • 修改模型设置条件,与 JavaScript 版本保持一致:
    // 设置模型(与 JavaScript 版本一致)
    if (availableModels.Count > 0)
    {
        if (availableModels.Count == 1)
        {
            SetModel(availableModels[0]);
        }
        else
        {
            // 支持多个模型的情况,传递第一个模型
            SetModel(availableModels[0]);
        }
        _modelGuess = null; // 清除猜测字典
    }
    

4. 清理冗余代码

删除的内容:

  • 删除了硬编码的 GetLayerConfig() 方法
  • 删除了硬编码的 GetLayerDirection() 方法
  • 删除了重复的层配置定义

与 JavaScript 版本的对比

JavaScript 版本逻辑

// 根据层配置过滤模型
for (var l in layerConfig) {
    if (!modelGuess[l]) continue;

    var dir = layerConfig[l].dir;
    for (var j = 0; j < modelList.length; j++) {
        var m = modelList[j];
        if (!dir[m]) {
            var idx = mlist.indexOf(m);
            if (idx >= 0)
                mlist.splice(idx, 1);
        }
    }
    if (mlist.length < 2)
        break;
}

// 设置模型
if (mlist.length > 0) {
    this.setModel(mlist);
    this.modelGuess = null;
}

C# 版本修复后逻辑

// 根据层配置过滤模型(与 JavaScript 版本保持一致)
foreach (var layer in modelGuess.Keys)
{
    if (!modelGuess[layer]) continue;

    if (layerConfig.TryGetValue(layer, out var config))
    {
        // 使用反射获取 dir 属性
        var configType = config.GetType();
        var dirProperty = configType.GetProperty("dir");
        if (dirProperty != null)
        {
            var dir = dirProperty.GetValue(config) as Dictionary<string, int>;
            if (dir != null)
            {
                // 移除不支持的模型(与 JavaScript 版本逻辑一致)
                for (int j = 0; j < modelList.Count; j++)
                {
                    var model = modelList[j];
                    if (!dir.ContainsKey(model))
                    {
                        var idx = availableModels.IndexOf(model);
                        if (idx >= 0)
                            availableModels.RemoveAt(idx);
                    }
                }
            }
        }
    }

    // 如果只剩下一个模型,直接设置(与 JavaScript 版本一致)
    if (availableModels.Count < 2)
        break;
}

// 设置模型(与 JavaScript 版本一致)
if (availableModels.Count > 0)
{
    SetModel(availableModels[0]);
    _modelGuess = null; // 清除猜测字典
}

修复效果

  1. 功能一致性: C# 版本的 LogModelGuess 方法现在与 JavaScript 版本功能完全一致
  2. 配置统一: 层配置统一从 LogsManager 获取,避免重复定义
  3. 代码质量: 删除了冗余代码,提高了代码的可维护性
  4. 类型安全: 使用反射正确处理动态对象,保持了类型安全

测试建议

  1. 测试不同层组合的模型猜测功能
  2. 验证模型设置逻辑的正确性
  3. 确认层配置的一致性
  4. 测试边界情况(如只有一个模型或多个模型的情况)