|
|
@ -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; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|