In C# Convert.ChangeType(jobj[p.Name].ToString(), p.Paramete

本文关键字:ToString Paramete Name Convert ChangeType jobj In | 更新日期: 2023-09-27 18:19:55

在具有JSON对象的C#中动态执行服务的代码

var jobj = JObject.FromObject(JSON Object);
object instance= new RestServices();
var mi = instance.GetType().GetMethod(jobj["method"].ToString(), BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
var parameters = mi.GetParameters()
             .Select(p => Convert.ChangeType(jobj[p.Name].ToString(), p.ParameterType))
             .ToArray();
object retval = mi.Invoke(instance, parameters);

我的服务有以下参数

1.InfoEdit service
{
  "method": "InfoEdit",                   
  "storeId":"1",
  "personalInfo": {
                  "Gender":"test",
                  "FirstName": "test",
                  "CompanyName": "test",
                  "PhoneNumber":"1153646",
                  "NewsLetter":"1"
                  }       
};
2.Login service
{
  "method": "Login",
  "apiSecretKey": "y109m113e122",
  "userName": "test@test.com",
  "password": "test",
  "isGuestCustomerId": 1
}

对于第一个(InfoEdit服务)请求参数,我得到了一个错误"从'System.String'到'DataClass.InfoEditResponse'的无效转换",而对于第二个(
Login服务)请求参数我的服务调用时没有遇到任何麻烦。

如果有人对此有想法,请提出建议。

提前感谢:)

In C# Convert.ChangeType(jobj[p.Name].ToString(), p.Paramete

您只需要使用JObjectToObject方法

var parameters = mi.GetParameters()
                .Select(p => jobj[p.Name].ToObject(p.ParameterType))
                .ToArray();
object retval = mi.Invoke(instance, parameters);