0

我有一个简单的静态方法,它不包含输出参数、返回任何内容或接受任何参数。我这样运行它:

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(this Assembly obj, string methodName, params Type[] list):MethodDelegate 我将如何使用它的方法?

编辑 2:我现在已经能够运行带有参数的静态方法,它发生如下:

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

仍然无法使用没有参数的方法...建议提出建议

4

2 回答 2

0

您需要使用,BindingFlags并且可能这就是您所缺少的。看看这个MSDN链接。为了演示,下面的代码块反映了一个returnbool 和修改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;
            }
        }
    }
于 2013-06-18T11:08:01.143 回答
0

经过大量的混乱和测试,我想通了......

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&) 我会很高兴:)

于 2013-06-18T12:53:21.570 回答