如何使用GetMethod获取输入参数类型?

时间:2014-12-29 20:18:41

标签: c# json json.net system.reflection

下午大家好, 我试图通过传递适当的参数来动态调用函数。 让我们说这个函数看起来像这样:

  

public string CreatePerson(Person p)

对象p作为Json接收,我想根据参数Type将其反序列化为适当的运行时类型,以便我可以将它传递给Newtonsoft.Json库函数JsonConvert.DeserializeObject(jsonReceived)。

以下是我的代码:

m = this.GetType().GetMethod(method);
List<object> a = new List<object>();
foreach (var param in m.GetParameters())
{
    //have to convert args parameter to appropriate function input
     a.Add(ProcessProperty(param.Name, param.ParameterType, args));

 }

 object invokeResult = null;
 invokeResult = m.Invoke(this, a.ToArray());


private object ProcessProperty(string propertyName, Type propertyType, string    jsonStringObject)
 {
     if (propertyType.IsClass && !propertyType.Equals(typeof(String)))
      {
          var argumentObject = Activator.CreateInstance(propertyType);
          argumentObject = JsonConvert.DeserializeObject<propertyType>(jsonStringObject);
           return argumentObject;
      }
  }

我收到以下错误:

The type or namespace name 'propertyType' could not be found (are you missing a using directive or an assembly reference?)

我在哪里接近这个错误? 如何在运行时动态获取参数Type,以便它可以处理除Person以外的类型并将其传递给DeserializeObject?

2 个答案:

答案 0 :(得分:4)

问题是泛型是在编译时完成的,你只知道运行时的类型。本质上,编译器认为propertyType应该是编译类型而不是Type类型的变量。

幸运的是,有一些重载会让你做你想做的事,比如DeserializeObject(String, Type)

像这样使用:

argumentObject = JsonConvert.DeserializeObject(jsonStringObject, propertyType);

答案 1 :(得分:3)

您不能将运行时System.Type propertyType用作泛型方法的类型参数。相反,使用采用运行时类型的DeserializeObject重载:

argumentObject = JsonConvert.DeserializeObject(jsonStringObject, propertyType);