使用反射运行带有out参数的静态方法

本文关键字:out 参数 静态方法 行带 反射 运行 | 更新日期: 2023-09-27 18:18:56

我有一个简单的静态方法,它不包含我们的参数,返回任何东西或接受任何参数。我是这样运行的:

Assembly assembly = ResourceConfig.GetAssembly("IntegrationServices");
assembly.GetStaticMethod("Current.IntegrationServices.SomeIntegration.SomeMethod").Invoke();

似乎运行正常…

接下来,我有一个静态方法,返回一个输出参数(这是一个字符串),并返回一个布尔值。我想运行这个,但不能弄清楚我做错了什么。这是我目前所看到的:

var objectArray = new object[1];
(bool)assembly.GetStaticMethod("Current.IntegrationServices.SomeIntegration.ReturningMethod").Invoke(objectArray)

根据我的理解,我应该能够访问objectArray[0]并获得我的输出值。但是当尝试运行这段代码时,我得到了错误:

Method Current.IntegrationServices.SomeIntegration.ReturningMethod() cannot be found.

我向你保证这种方法确实存在…:)

在没有反射的情况下调用这个方法会发生如下情况:

string s;
bool value = Current.IntegrationServices.SomeIntegration.ReturningMethod(out s);

关于如何使它与GetStaticMethod和Invoke一起运行的任何建议?

编辑:我刚刚发现了一个叫做GetStaticMethodWithArgs的方法(这个Assembly obj, string methodName, params Type[] list):

编辑2:我现在已经能够运行一个带参数的静态方法,它是这样发生的:

Assembly assembly = ResourceConfig.GetAssembly("IntegrationServices");
var staticMethodWithArgs = assembly.GetStaticMethodWithArgs("Current.IntegrationServices.SomeIntegration.ReturningMethod", typeof(string), typeof(string));
staticMethodWithArgs.Invoke(InputUsername.Text, InputPassword.Text)

仍然不能使用没有参数的方法…欢迎提出建议

使用反射运行带有out参数的静态方法

您需要使用BindingFlags,这可能是您所缺少的。看看这个MSDN链接。为了演示,下面的代码块反映了一个静态方法,其中return bool并修改了out参数。

 using System;
    using System.Reflection;
    namespace ConsoleApplication1
    {
        public class StaticInvoke
        {
            private static void Main()
            {
                MethodInfo info = typeof(StaticInvoke).GetMethod("SampleMethod", BindingFlags.Public | BindingFlags.Static);
                var input = new object[] {"inputValue"};
                var value = info.Invoke(null, input);
                Console.WriteLine(value);
                Console.WriteLine(input[0]);
                Console.ReadLine();
            }
            public static bool SampleMethod(out string input)
            {
                input = "modified val";
                Console.WriteLine("I am executing");
                return true;
            }
        }
    }

经过大量的混乱和测试,我找到了....如果我使用了正确的变量类型,那一切都很好。它必须是String&我得到它的方法是:

methodInfo.GetParameters()[0].ParameterType.UnderlyingSystemType

当我进一步尝试这个代码看起来像这样:

Assembly assembly = ResourceConfig.GetAssembly("IntegrationServices");
BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod;
MethodInfo methodInfo = assembly.GetType("Current.IntegrationServices.SomeIntegration").GetMethod("GetAbaxUserToken", bindingFlags);
var staticMethodWithArgs = assembly.GetStaticMethodWithArgs("Current.IntegrationServices.SomeIntegration.ReturningMethod", methodInfo.GetParameters()[0].ParameterType.UnderlyingSystemType);

这反过来又导致我调用MethodInfo,并放弃GetStaticMethodWithArgs概念…如果有人知道如何获得String&typeof(String&)那太好了