【问题标题】:How to convert json string to methodinfo parameter?如何将json字符串转换为methodinfo参数?
【发布时间】:2020-03-20 10:45:24
【问题描述】:

我正在尝试将 json 字符串转换为 MethodInfo 参数类型。我有以下几点:

Type type = typeof(MyClass);
MethodInfo mi = type.GetMethod(myMethod);
ParameterInfo [] parameteres=mi.GetParameters();
var jsonString="{\"LastName\":\"Test\"}"

使用这些代码,我的输入类型为mymethod,它是一个包含名为LastName 的属性的类(类名为Class1)。

现在如何将jsonString 转换为Class1

提示:我们在运行时得到类型 Class1

【问题讨论】:

  • 你可以将JSON解析成另一个对象并作为函数参数发送
  • DeserializeObject 有不同的方法重载,用于接受类型的非泛型。您可以在此处查看重载列表newtonsoft.com/json/help/html/…
  • @styx 你是对的。请将其作为答案发布,以便我选择它作为正确答案。
  • @HamidReza 需要使用反射吗?因为 TemaTre 答案很好
  • @styx 这对我不起作用,因为它正在动态创建实例。

标签: c# json dynamic casting type-conversion


【解决方案1】:

所以,ParameterInfo 类有它自己的属性 ParameterType。 你应该得到这个参数和一些库来像这样使用 Json https://www.nuget.org/packages/Newtonsoft.Json/

那么代码会是这样的

Type type = typeof(MyClass);
MethodInfo mi = type.GetMethod(myMethod);
ParameterInfo [] parameteres=mi.GetParameters();
ParameterInfo myParameter = parameteres.FirstOrDefault();

var jsonString="{\"LastName\":\"Test\"}"
var myObjParameter = JsonConvert.DeserializeObject(jsonString, myParameter.ParameterType );

//Then create an objevt of main class.
ConstructorInfo constr = type .GetConstructor(Type.EmptyTypes);
object classInstance = constr.Invoke(new object[]{});

//And call method for this object
mi .Invoke(classInstance , new object[]{ myObjParameter });

【讨论】:

    【解决方案2】:

    假设你的班级是这样的

            public class MyClass
            {
                public string LastName { get; set; }
                private void myMethod(string LastName)
                {
                    //do sutff
                }
            }
    

    你可以像这样简单地反序列化字符串(你可以使用Json.NET

       var jsonString = "{\"LastName\":\"Test\"}";
       var lastName = JsonConvert.DeserializeObject<MyClass>(jsonString);
    

    现在您可以根据需要动态或静态使用lastName

    【讨论】: