下午大家好, 我试图通过传递适当的参数来动态调用函数。 让我们说这个函数看起来像这样:
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?
答案 0 :(得分:4)
问题是泛型是在编译时完成的,你只知道运行时的类型。本质上,编译器认为propertyType
应该是编译类型而不是Type
类型的变量。
幸运的是,有一些重载会让你做你想做的事,比如DeserializeObject(String, Type)
像这样使用:
argumentObject = JsonConvert.DeserializeObject(jsonStringObject, propertyType);
答案 1 :(得分:3)
您不能将运行时System.Type propertyType
用作泛型方法的类型参数。相反,使用采用运行时类型的DeserializeObject
重载:
argumentObject = JsonConvert.DeserializeObject(jsonStringObject, propertyType);