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
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. 测试边界情况(如只有一个模型或多个模型的情况)
|