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.

150 lines
4.2 KiB

1 month ago
# LogModelGuess 方法修复总结
## 修复内容
### 1. 集成 LogsManager 获取层配置
**问题**: 原 C# 版本中的 `LogModelGuess` 方法使用了硬编码的层配置,与 JavaScript 版本不一致。
**修复**:
-`LogsManager` 类中添加了 `GetLayerConfig()` 方法
- 修改 `LTEClient.LogModelGuess()` 方法,从 `LogsManager` 获取层配置
- 确保层配置与 JavaScript 版本保持一致
### 2. 修复方向配置处理
**问题**: 原版本使用反射获取 `dir` 属性,但处理逻辑与 JavaScript 版本不一致。
**修复**:
- 使用反射正确获取层配置中的 `dir` 属性
- 按照 JavaScript 版本的逻辑过滤模型:
```csharp
// 移除不支持的模型(与 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 版本保持一致:
```csharp
// 设置模型(与 JavaScript 版本一致)
if (availableModels.Count > 0)
{
if (availableModels.Count == 1)
{
SetModel(availableModels[0]);
}
else
{
// 支持多个模型的情况,传递第一个模型
SetModel(availableModels[0]);
}
_modelGuess = null; // 清除猜测字典
}
```
### 4. 清理冗余代码
**删除的内容**:
- 删除了硬编码的 `GetLayerConfig()` 方法
- 删除了硬编码的 `GetLayerDirection()` 方法
- 删除了重复的层配置定义
## 与 JavaScript 版本的对比
### 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# 版本修复后逻辑
```csharp
// 根据层配置过滤模型(与 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. 测试边界情况(如只有一个模型或多个模型的情况)