欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#通过字符串名称来调用对应字符串名称的方法

程序员文章站 2022-06-05 21:01:15
前段时间在一个项目中,在一个地方要将函数所在类中的方法都调用一遍,但是否调用要通过配置文件中的内容决定。所以为了减少代码量,在网上查了相关信息,终于成功的将其应用到了项目中,我在这里将我做的一个简单例子提供给大家,便于大家方便下载和理解。 主要用到了反射的一个特性,主要代码如下: 基本步骤就是: 1 ......

前段时间在一个项目中,在一个地方要将函数所在类中的方法都调用一遍,但是否调用要通过配置文件中的内容决定。所以为了减少代码量,在网上查了相关信息,终于成功的将其应用到了项目中,我在这里将我做的一个简单例子提供给大家,便于大家方便下载和理解。

主要用到了反射的一个特性,主要代码如下:

object[] _params = new object[kvp.value.length]; 
for (int i = 0; i <= _params.length - 1; i++)
{
_params[i] = kvp.value[i]; 
}

type t = typeof(listofway); 
methodinfo mi = t.getmethod(kvp.key.tostring()); 
object objinstance = activator.createinstance(t); 
int result = (int)mi.invoke(objinstance, _params);

基本步骤就是:

1、将要调用的方法的参数全部依次放入一个object数组中;

2、用反射一个特性,获得方法所在类的类型;

3、根据对象和方法参数去调用这个方法。

 详细代码:

C#通过字符串名称来调用对应字符串名称的方法
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
using system.xml;
using system.reflection;

using testway;

namespace 加载xml及调用字符串名的函数
{
    class program
    {
        static void main(string[] args)
        {
            dictionary<string, string[]> dict = new dictionary<string, string[]>();
            string path = @"inputparam.xml";

            readxml(path, dict);

            foreach (keyvaluepair<string, string[]> kvp in dict)
            {

                #region 根据字符串去调用与字符串相同名称的方法
                object[] _params = new object[kvp.value.length];  //根据键值对中值的多少声明一个同样大小的字符串数组
                for (int i = 0; i <= _params.length - 1; i++)
                {
                    _params[i] = kvp.value[i];       //将键值对中的值写入数组中
                }

                type t = typeof(listofway);           //获得方法所在的类的类型
                methodinfo mi = t.getmethod(kvp.key.tostring());       //根据字符串名称获得对应的方法
                object objinstance = activator.createinstance(t);      //创建一个方法所在的类的一个对象
                int result = (int)mi.invoke(objinstance, _params);     //根据对象和方法参数去执行方法
                #endregion

                console.writeline(result);
            }

            console.readline();
        }

        #region way2
        /// <summary>
        /// 读取xml文档
        /// </summary>
        /// <param name="path">xml路径(含名称)</param>
        /// <param name="dict">xml中参数字典</param>

        public static void readxml(string path, dictionary<string, string[]> dict)
        {
            xmldocument xml = new xmldocument();
            xml.load(path);
            xmlelement xmlroot = xml.documentelement;      //根节点
            xmlnodelist xmllist = xmlroot.childnodes;      //根节点下所有子节点(一般是二级节点)
            foreach (xmlnode item in xmllist)
            {
                xmlnodelist inxmllist = item.childnodes;   //每个子节点下的所有子节点(一般是三级节点,也基本是最内层节点)
                string[] param = new string[inxmllist.count];
                for (int i = 0; i <= inxmllist.count - 1; i++)
                {
                    param[i] = inxmllist[i].innertext;     //将每个子节点的值放入数组
                }
                dict.add(item.name, param);
            }
        }
        #endregion

    }
}
view code

用于测试的方法所在的类的代码:

C#通过字符串名称来调用对应字符串名称的方法
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;

namespace testway
{
    public class listofway
    {
        public int add(string a, string b)
        {
            return convert.toint32(a) + convert.toint32(b);
        }
        public int sub(string a, string b)
        {
            return convert.toint32(a) - convert.toint32(b);
        }
        public int mul(string a, string b)
        {
            return convert.toint32(a) * convert.toint32(b);
        }
        public int div(string a, string b)
        {
            return convert.toint32(a) / convert.toint32(b);
        }

    }
}
view code