当前位置: 移动技术网 > IT编程>开发语言>.net > C#通过字符串名称来调用对应字符串名称的方法

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

2019年04月01日  | 移动技术网IT编程  | 我要评论

赵瑞雪微博,小学教师家访记录,思维与智慧杂志

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

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

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、根据对象和方法参数去调用这个方法。

 详细代码:

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

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

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

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网