2018年3月23日11:01:26


如果代码中有一大波需要调用的函数或希望通过函数名称来调用函数或将函数们放到一个容器里面进行调用(将函数名称放到string[]里面进行调用),使用如下方法可以使调用的逻辑和代码量都更简单且使代码密度更加紧凑。

类库依赖

using System.Reflection

基本思路-总共三步完成调用

使用Type类获取所要调用的方法所在的类对象

Type t = typeof(Program); 
//参数为所要使用的函数所在的类的类名。

使用GetMethod获得对应的函数、方法

MethodInfo mt = t.GetMethod("foo");

注:
GetMethod函数有6个重载函数,其中常用的有2个。

public MethodInfo GetMethod(string name)

public MethodInfo GetMethod(string name,BindingFlagsbindingAttr)

name为所要使用的函数名 bindingAttr为搜索范围

第一个函数对 name的搜索区分大小写。搜索范围包括公共静态方法和公共实例方法。若搜索的函数不在此范围内,则应使用第二个函数。

若成功搜索到函数,则返回非null值,否则返回非空值,在向下执行前应检查一下返回值,否则会报错。

最后一步:确认取得的方法是有效的(!= null)之后,使用Invoke即可执行方法

string str = (string)mt.Invoke(null,new object[] {"bar"});
string str2 = (string)mt.Invoke(this,new string[] {@"非静态方法第一个参数就是主调对象实例");

注:

Invoke函数的原型如下:

public Object Invoke(Object obj,Object[] parameters)

第一个参数为对其调用方法或构造函数的对象。如果方法是静态的,则应为null,否则必需给出一个实例,若在同一类中调用,则可指定为this。

第二个参数为调用的方法的参数列表。这是一个对象数组,这些对象与要调用的方法或构造函数的参数具有相同的数量、顺序和类型。如果没有任何参数,则 parameters应为null Nothing nullptr null引用。

函数的返回值便为所调用的函数的返回值,若无返回值,则为null。在获取返回值前应进行强制类型转换。

示例

using System;

using System.Collections.Generic;

using System.Text;

using System.Reflection;

namespace Namespace

{

    class Program

    {

        static    void Main(string[]    args)

        {

            Type    t = typeof(Program);//参数为所要使用的函数所在的类的类名。

            MethodInfo    mt = t.GetMethod("foo");

            if    (mt == null)

            {

                Console.WriteLine("没有获取到相应的函数!!");

            }

            else

            {

                string    str = (string)mt.Invoke(null,newobject[] { "1234567890"    });

                Console.WriteLine(str);

            }

            Console.ReadKey();

        }

        private static string foo(string abc)

        {

            return  abc;

        }

    }

}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐