C#中反射里的invoke方法的参数

Posted 何以解忧 `唯有暴富

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中反射里的invoke方法的参数相关的知识,希望对你有一定的参考价值。

对于外部调用的动态库应用反射时要用到Assembly.LoadFile(),然后才是获取类型、执行方法等;
当用反射创建当前程序集中对象实例或执行某个类下静态方法时只需通过Type.GetType("类的完整名")。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

//一个最简单的C#反射实例,首先编写类库如下:
namespace ReflectionTest
{
    public class WriteTest
    {
        //带参数的公共方法
        public void WriteString(string s, int i)
        {
            Console.WriteLine("WriteString:" + s + i.ToString());
        }
        //带一个参数的静态方法
        public static void StaticWriteString(string s)
        {
            Console.WriteLine("StaticWriteString:" + s);
        }
        //不带参数的静态方法
        public static void NoneParaWriteString()
        {
            Console.WriteLine("NoParaWriteString");
        }
    }

    public class TestApp
    {
        public static void Main()
        {
            Assembly ass;
            Type type;
            Object obj;
            //用来测试静态方法
            Object any = new Object();
            //指定类库文件必须使用绝对路径,不能使用相对路径
            ass = Assembly.LoadFile(@"c:\\ReflectTest.dll");
            //命名空间和类的名字必须一起指定
            type = ass.GetType("ReflectionTest.WriteTest");
            /**//*example1---------*/
            MethodInfo method = type.GetMethod("WriteString");
            string test = "test";
            int i = 1;
            Object[] parametors = new Object[] { test, i };
            //在例子1种必须实例化反射要反射的类,因为要使用的方法并不是静态方法。
            //创建对象实例
            obj = ass.CreateInstance("ReflectionTest.WriteTest"); //执行带参数的公共方法
            method.Invoke(obj, parametors);
            //method.Invoke(any, parametors);//异常:必须实例化反射要反射的类,因为要使用的方法并不是静态方法。
            /**//*example2----------*/
            method = type.GetMethod("StaticWriteString");
            method.Invoke(null, new string[] { "test" }); //第一个参数忽略//对于第一个参数是无视的,也就是我们写什么都不会被调用,
                                                          //即使我们随便new了一个any这样的Object,当然这种写法是不推荐的。
                                                          //但是对应在例子1种我们如果Invoke的时候用了类型不一致的实例来做为参数的话,将会导致一个运行时的错误。
            method.Invoke(obj, new string[] { "test" });
            method.Invoke(any, new string[] { "test" });
            /**//*example3-----------*/
            method = type.GetMethod("NoneParaWriteString"); //调用无参数静态方法的例子,这时候两个参数我们都不需要指定,用null就可以了。
            method.Invoke(null, null);
        }
    }
}

 

以上是关于C#中反射里的invoke方法的参数的主要内容,如果未能解决你的问题,请参考以下文章

C#控制台 activator与invoke,利用反射调用一个类的有参数方法

带有 out 参数的 control.invoke

java反射机制之Method invoke执行调用方法例子

java反射的invoke方法

java invoke 反射的使用方法有哪些?

java反射中method类中的invoke方法作用