Browse Source

错误

master
赵鹏 1 day ago
parent
commit
eba00bc74e
  1. 356
      ReZero/SuperAPI/MethodGeneratorAPI/MethodGeneratorAPI.cs

356
ReZero/SuperAPI/MethodGeneratorAPI/MethodGeneratorAPI.cs

@ -65,6 +65,24 @@ namespace ReZero.SuperAPI
// 先检查method的参数类型 // 先检查method的参数类型
var methodParams = methodInfo.GetParameters(); var methodParams = methodInfo.GetParameters();
// 使用新的参数绑定方式:直接根据方法参数类型进行JSON绑定
if (!string.IsNullOrEmpty(dataModel.RawJsonData))
{
try
{
bool bindingSuccess = DirectJsonParameterBinding(dataModel, methodInfo, parameters);
if (bindingSuccess)
{
return parameters;
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"直接绑定失败: {ex.Message},回退到原有绑定方式");
}
}
// 如果直接绑定失败,回退到现有逻辑
// 先尝试判断是否是JToken/JObject参数 // 先尝试判断是否是JToken/JObject参数
if (methodParams.Length == 1 && if (methodParams.Length == 1 &&
(typeof(Newtonsoft.Json.Linq.JToken).IsAssignableFrom(methodParams[0].ParameterType))) (typeof(Newtonsoft.Json.Linq.JToken).IsAssignableFrom(methodParams[0].ParameterType)))
@ -275,24 +293,8 @@ namespace ReZero.SuperAPI
try try
{ {
// 检查原始JSON是否需要转义处理
if (rawJson.Contains("\\\""))
{
rawJson = rawJson.Replace("\\\"", "\"");
}
// 解析JSON // 解析JSON
JObject jsonObj = null; JObject jsonObj = JObject.Parse(rawJson);
try
{
jsonObj = JObject.Parse(rawJson);
System.Diagnostics.Debug.WriteLine($"成功解析JSON对象,属性数量: {jsonObj.Properties().Count()}");
}
catch
{
System.Diagnostics.Debug.WriteLine("JSON解析失败,尝试使用JsonConvert");
throw;
}
// 获取方法参数信息 // 获取方法参数信息
var methodParams = methodInfo.GetParameters(); var methodParams = methodInfo.GetParameters();
@ -305,6 +307,35 @@ namespace ReZero.SuperAPI
System.Diagnostics.Debug.WriteLine($"参数名: {paramName}, 类型: {paramType.Name}"); System.Diagnostics.Debug.WriteLine($"参数名: {paramName}, 类型: {paramType.Name}");
// 特殊处理:如果参数类型为JObject或JToken,直接使用整个JSON对象
if (typeof(JToken).IsAssignableFrom(paramType))
{
System.Diagnostics.Debug.WriteLine($"检测到JToken类型参数,直接使用整个JSON对象");
if (paramType == typeof(JObject))
{
parameters[0] = jsonObj;
System.Diagnostics.Debug.WriteLine("成功绑定JObject参数");
}
else if (paramType == typeof(JToken))
{
parameters[0] = (JToken)jsonObj;
System.Diagnostics.Debug.WriteLine("成功绑定JToken参数");
}
else if (paramType == typeof(JArray))
{
try
{
parameters[0] = JArray.Parse(rawJson);
System.Diagnostics.Debug.WriteLine("成功绑定JArray参数");
}
catch
{
System.Diagnostics.Debug.WriteLine("JSON不是有效的数组格式,无法绑定JArray参数");
}
}
return; // 处理完成,直接返回
}
// 检查JSON中是否存在与参数同名的属性 // 检查JSON中是否存在与参数同名的属性
if (jsonObj.ContainsKey(paramName)) if (jsonObj.ContainsKey(paramName))
{ {
@ -315,13 +346,32 @@ namespace ReZero.SuperAPI
// 转换为参数类型 // 转换为参数类型
try try
{ {
// 特殊处理List<T>类型参数
if (propValue.Type == JTokenType.Array && if (propValue.Type == JTokenType.Array &&
(paramType.IsGenericType && paramType.IsGenericType &&
paramType.GetGenericTypeDefinition() == typeof(List<>))) paramType.GetGenericTypeDefinition() == typeof(List<>))
{ {
// 处理数组到List的转换 // 获取List的泛型参数类型
Type itemType = paramType.GetGenericArguments()[0];
System.Diagnostics.Debug.WriteLine($"处理List<{itemType.Name}>类型参数");
// 获取JSON数组字符串
string arrayJson = propValue.ToString(); string arrayJson = propValue.ToString();
parameters[0] = JsonConvert.DeserializeObject(arrayJson, paramType);
// 使用指定的设置反序列化
var settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
};
parameters[0] = JsonConvert.DeserializeObject(arrayJson, paramType, settings);
// 如果反序列化结果为null,则创建空列表
if (parameters[0] == null)
{
var listType = typeof(List<>).MakeGenericType(itemType);
parameters[0] = Activator.CreateInstance(listType);
}
System.Diagnostics.Debug.WriteLine($"成功将数组属性 {paramName} 转换为List类型"); System.Diagnostics.Debug.WriteLine($"成功将数组属性 {paramName} 转换为List类型");
} }
else else
@ -360,32 +410,10 @@ namespace ReZero.SuperAPI
catch (Exception ex) catch (Exception ex)
{ {
System.Diagnostics.Debug.WriteLine($"JSON反序列化失败: {ex.Message}"); System.Diagnostics.Debug.WriteLine($"JSON反序列化失败: {ex.Message}");
// 如果反序列化失败,尝试JToken特殊处理
if (typeof(JToken).IsAssignableFrom(paramType))
{
if (paramType == typeof(JObject))
{
parameters[0] = jsonObj;
System.Diagnostics.Debug.WriteLine("直接使用解析后的JObject");
}
else if (paramType == typeof(JToken))
{
parameters[0] = jsonObj;
System.Diagnostics.Debug.WriteLine("将JObject转换为JToken");
}
else
{
System.Diagnostics.Debug.WriteLine($"无法处理的JToken子类型: {paramType.Name}");
}
}
else
{
System.Diagnostics.Debug.WriteLine($"无法将JSON转换为类型 {paramType.Name}"); System.Diagnostics.Debug.WriteLine($"无法将JSON转换为类型 {paramType.Name}");
} }
} }
} }
}
else if (methodParams.Length > 1) else if (methodParams.Length > 1)
{ {
// 多参数方法的处理 // 多参数方法的处理
@ -421,8 +449,40 @@ namespace ReZero.SuperAPI
// 回退到原始方法 // 回退到原始方法
try try
{ {
var type = methodInfo.GetParameters().First().ParameterType; var paramInfo = methodInfo.GetParameters().First();
parameters[0] = JsonConvert.DeserializeObject(rawJson, type); var paramType = paramInfo.ParameterType;
// 对于JObject/JToken类型,尝试直接解析
if (typeof(JToken).IsAssignableFrom(paramType))
{
try
{
if (paramType == typeof(JObject))
{
parameters[0] = JObject.Parse(rawJson);
System.Diagnostics.Debug.WriteLine("回退处理:成功解析为JObject");
}
else if (paramType == typeof(JToken))
{
parameters[0] = JToken.Parse(rawJson);
System.Diagnostics.Debug.WriteLine("回退处理:成功解析为JToken");
}
else if (paramType == typeof(JArray))
{
parameters[0] = JArray.Parse(rawJson);
System.Diagnostics.Debug.WriteLine("回退处理:成功解析为JArray");
}
}
catch (Exception jEx)
{
System.Diagnostics.Debug.WriteLine($"回退处理JToken解析失败: {jEx.Message}");
}
}
else
{
parameters[0] = JsonConvert.DeserializeObject(rawJson, paramType);
System.Diagnostics.Debug.WriteLine("回退处理:使用JsonConvert反序列化");
}
} }
catch (Exception fallbackEx) catch (Exception fallbackEx)
{ {
@ -710,5 +770,211 @@ namespace ReZero.SuperAPI
else else
return Newtonsoft.Json.Linq.JValue.CreateNull(); return Newtonsoft.Json.Linq.JValue.CreateNull();
} }
// 直接根据方法参数信息进行JSON绑定
private bool DirectJsonParameterBinding(DataModel dataModel, MethodInfo methodInfo, object[] parameters)
{
var rawJson = dataModel.RawJsonData;
if (string.IsNullOrEmpty(rawJson))
{
return false;
}
System.Diagnostics.Debug.WriteLine($"直接根据方法参数进行JSON绑定,JSON: {rawJson}");
try
{
// 解析JSON
JObject jsonObj = JObject.Parse(rawJson);
var methodParams = methodInfo.GetParameters();
// 检查参数数量
if (methodParams.Length == 0)
{
return false; // 没有参数需要绑定
}
// 单参数情况优先处理
if (methodParams.Length == 1)
{
var paramInfo = methodParams[0];
var paramName = paramInfo.Name;
var paramType = paramInfo.ParameterType;
System.Diagnostics.Debug.WriteLine($"单参数处理: 名称={paramName}, 类型={paramType.FullName}");
// 处理JToken及其子类型
if (typeof(Newtonsoft.Json.Linq.JToken).IsAssignableFrom(paramType))
{
parameters[0] = paramType == typeof(Newtonsoft.Json.Linq.JObject)
? jsonObj
: (paramType == typeof(Newtonsoft.Json.Linq.JArray)
? JArray.Parse(rawJson)
: JToken.Parse(rawJson));
return true;
}
// 检查是否有与参数同名的属性
if (jsonObj.ContainsKey(paramName))
{
JToken propValue = jsonObj[paramName];
// 特殊处理泛型List
if (propValue.Type == JTokenType.Array &&
paramType.IsGenericType &&
paramType.GetGenericTypeDefinition() == typeof(List<>))
{
Type itemType = paramType.GetGenericArguments()[0];
System.Diagnostics.Debug.WriteLine($"泛型List处理: 项类型={itemType.FullName}");
try
{
// 使用TypeNameHandling.All可以帮助处理多态类型
var serializerSettings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto,
NullValueHandling = NullValueHandling.Ignore
};
string arrayJson = propValue.ToString();
var listObj = JsonConvert.DeserializeObject(arrayJson, paramType, serializerSettings);
// 如果反序列化结果为null,尝试手动创建列表
if (listObj == null)
{
var listType = typeof(List<>).MakeGenericType(itemType);
var list = Activator.CreateInstance(listType);
// 手动将每个JSON项转换为目标类型
JArray jArray = JArray.Parse(arrayJson);
var addMethod = listType.GetMethod("Add");
foreach (var item in jArray)
{
try
{
var objItem = item.ToObject(itemType, JsonSerializer.Create(serializerSettings));
addMethod.Invoke(list, new[] { objItem });
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"列表项转换失败: {ex.Message}");
}
}
listObj = list;
}
parameters[0] = listObj;
System.Diagnostics.Debug.WriteLine($"成功绑定List参数: 元素数量={(listObj as System.Collections.IList)?.Count ?? 0}");
return true;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"List绑定异常: {ex.Message}");
// 出错时创建空列表而不是返回null
var listType = typeof(List<>).MakeGenericType(itemType);
parameters[0] = Activator.CreateInstance(listType);
return true;
}
}
else
{
// 常规类型转换
try
{
parameters[0] = propValue.ToObject(paramType);
return true;
}
catch
{
// 转换失败,继续使用回退处理
}
}
}
else
{
// 尝试将整个JSON对象反序列化为参数类型
try
{
parameters[0] = JsonConvert.DeserializeObject(rawJson, paramType);
if (parameters[0] != null)
{
return true;
}
}
catch
{
// 转换失败,继续使用回退处理
}
}
}
else
{
// 多参数处理
bool anyParamBound = false;
for (int i = 0; i < methodParams.Length; i++)
{
var paramInfo = methodParams[i];
var paramName = paramInfo.Name;
var paramType = paramInfo.ParameterType;
if (jsonObj.ContainsKey(paramName))
{
try
{
JToken propValue = jsonObj[paramName];
// 特殊处理泛型List
if (propValue.Type == JTokenType.Array &&
paramType.IsGenericType &&
paramType.GetGenericTypeDefinition() == typeof(List<>))
{
Type itemType = paramType.GetGenericArguments()[0];
var serializerSettings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto,
NullValueHandling = NullValueHandling.Ignore
};
string arrayJson = propValue.ToString();
var listObj = JsonConvert.DeserializeObject(arrayJson, paramType, serializerSettings);
if (listObj == null)
{
var listType = typeof(List<>).MakeGenericType(itemType);
listObj = Activator.CreateInstance(listType);
}
parameters[i] = listObj;
}
else
{
parameters[i] = propValue.ToObject(paramType);
}
anyParamBound = true;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"多参数绑定失败: {paramName}, {ex.Message}");
}
}
}
return anyParamBound;
}
return false;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"直接绑定总异常: {ex.Message}");
return false;
}
}
} }
} }

Loading…
Cancel
Save