我有一个像下面这样的方法,其中Days
是具有从Sunday
到Saturday
值的Enum
,我正在使用反射调用。我有很多类似的方法,不同的签名,输入参数也是动态的,我得到一个JSON。
Public Sub ReflectionMethod(ByVal stringParam As String, ByVal enumParam As Days)
Console.WriteLine($"Executed:ReflectionMethod | stringParam : {stringParam}; enumParam : {enumParam}")
End Sub
下面的代码用于解析JSON并使用反射调用方法。
Dim inputJson As String = "['Sample Input',2]"
Dim lstObjects As List(Of Object) = JsonConvert.DeserializeObject(Of List(Of Object))(inputJson)
Dim method As MethodInfo = consoleObject.GetType.GetMethod("ReflectionMethod")
method.Invoke(consoleObject, lstObjects.ToArray)
在执行上述代码时抛出以下错误,在调试过程中注意到method.Invoke()
方法失败了,反序列化没有任何问题。
例外:类型的对象的系统。Int64'不能转换为'VBConsole.Days'类型。
请注意:这不是我使用的实际代码,只是创建了一个易于调试的控制台应用程序,并且在C#
中的答案也很感激,这就是为什么将其标记为c#
为了将JSON值数组传递给要通过反射调用的方法,必须将每个JSON值反序列化为所需的参数类型。可以这样做:
Public Sub InvokeMethodWithJsonArguments(ByVal consoleObject As Object, ByVal methodName As String, ByVal inputJson As String)
Dim lstObjects As List(Of JToken) = JsonConvert.DeserializeObject(Of List(Of JToken))(inputJson) ' Deserialize to an intermediate list of JToken values
Dim method As MethodInfo = consoleObject.GetType.GetMethod(methodName)
Dim parameterTypes = method.GetParameters().Select(Function(p) p.ParameterType) ' Get the required type of each argument.
Dim args = lstObjects.Zip(parameterTypes, Function(first, second) first.ToObject(second)).ToArray() ' Deserialize each JToken to the corresponding required type
method.Invoke(consoleObject, args) ' Invoke with the deserialized arguments.
End Sub
指出:
我假设你需要一个不硬编码参数类型的解决方案。
MethodInfo.GetParameters()
返回一个参数信息数组,该数组与要调用的方法的签名相匹配。JToken.ToObject(Type)
将JSON标记反序列化为运行时指定的类型。
此处演示小提琴