MethodInfo.当参数为Enum类型时,调用失败



我有一个像下面这样的方法,其中Days是具有从SundaySaturday值的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标记反序列化为运行时指定的类型。

此处演示小提琴

相关内容

  • 没有找到相关文章

最新更新