使用反射运行带有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)
仍然不能使用没有参数的方法…欢迎提出建议
您需要使用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&)那太好了