博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#通过字符串名称来调用对应字符串名称的方法
阅读量:5237 次
发布时间:2019-06-14

本文共 3447 字,大约阅读时间需要 11 分钟。

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

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

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
dict = new Dictionary
(); string path = @"InputParam.xml"; ReadXml(path, dict); foreach (KeyValuePair
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 ///
/// 读取XML文档 /// ///
xml路径(含名称) ///
xml中参数字典 public static void ReadXml(string path, Dictionary
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

 

转载于:https://www.cnblogs.com/yzw1298023866/p/10632434.html

你可能感兴趣的文章
ajax请求aspx
查看>>
RabbitMQ-2
查看>>
PAT——1035. 插入与归并
查看>>
JS 在元素后面添加新的元素
查看>>
One Night Ultimate Werewolf Daybreak
查看>>
downloadId = downloadId || "downloads"
查看>>
目标,执行,绩效
查看>>
微软Azure运营方世纪互联遭做空后强劲反弹
查看>>
根据经纬度算距离
查看>>
恋爱的心声
查看>>
git 服务器搭建与运用
查看>>
(组件、路由)懒加载
查看>>
数据库查询拼接
查看>>
《C++反汇编与逆向分析技术揭秘》之十——构造函数
查看>>
2018年学习的一门语言
查看>>
lightoj 1057 - Collecting Gold(状压dp)
查看>>
1401机器翻译(Noip2010提高组第1题)
查看>>
矢量图
查看>>
CSS--文本属性
查看>>
【二次元的CSS】—— 用 DIV + CSS3 画咸蛋超人(详解步骤)
查看>>