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

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

object[] _params = new object[kvp.Value.Length];
for (int i = ; i <= _params.Length - ; 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 = ; i <= _params.Length - ; 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 = ; i <= inxmllist.Count - ; i++)
{
param[i] = inxmllist[i].InnerText; //将每个子节点的值放入数组
}
dict.Add(item.Name, param);
}
}
#endregion }
}

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

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);
} }
}

C#通过字符串名称来调用对应字符串名称的方法的更多相关文章

  1. dbda封装类(包括:返回二维数组、Ajax调用返回字符串、Ajax调用返回JSON)

    <?php class DBDA { public $host = "localhost"; public $uid = "root"; public $ ...

  2. delphi不同版本字符串类型的演化(要支持基于firemonkey的app调用,字符串最好使用olevariant类型)

    string,DELPHI2009以前的版本string=ansistring,一个字符占一个字节,DELPHI2009及以上版本string=unicodestring,一个字符占二个字节. cha ...

  3. python中通过字符串名来调用函数

    强调:eval()函数功能虽然强大,但是也很危险,这个方法需要慎重使用. 利用python中的内置函数 eval() ,函数说明: def eval(*args, **kwargs): # real ...

  4. javascrit中“字符串为什么可以调用成员”

    <script> var title = "this is title"; console.log(title.substr(0,5));   //字符串为什么可以调用 ...

  5. 【php 之根据函数名称动态调用该函数】

    解释函数:call_user_func()以及函数call_user_func_array() 对于PHP程序员而言,函数是再熟悉不过的事物了,毕竟我们整天都在和PHP内置函数以及我们自定义的函数打交 ...

  6. 字符串 映射相应的 函数 字符串驱动技术—— MethodAddress , MethodName , ObjectInvoke

    http://blog.csdn.net/qustdong/article/details/7267258 字符串驱动技术—— MethodAddress , MethodName , ObjectI ...

  7. Shell基础(四):字符串截取及切割、字符串初值的处理、基使用Shell数组、expect预期交互、使用正则表达式

    一.字符串截取及切割 目标: 使用Shell完成各种Linux运维任务时,一旦涉及到判断.条件测试等相关操作时,往往需要对相关的命令输出进行过滤,提取出符合要求的字符串. 本案例要求熟悉字符串的常见处 ...

  8. Java字符串操作及与C#字符串操作的不同

    每种语言都会有字符串的操作,因为字符串是我们平常开发使用频率最高的一种类型.今天我们来聊一下Java的字符串操作及在某些具体方法中与C#的不同,对于需要熟悉多种语言的人来说,作为一种参考.进行诫勉 首 ...

  9. Python全栈开发-执行字符串形式的语句和字符串形式的表达式方法(即exec和eval方法)

    Python有时需要动态的创造Python代码,然后将其作为语句执行  或  作为表达式计算. exec用于执行存储在字符串中的Python代码.   1. 语句与表达式的区别:表达式是 某事,语句是 ...

随机推荐

  1. 利用PHP脚本辅助MySQL数据库管理2-表主键表索引

    <?php $dbi = new DbMysql; $dbi->dbh = 'mysql://root:mysql@127.0.0.1/coffeetest'; $map = array( ...

  2. Python脚本语言第一行的写法

    脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它,就这么简单 #!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python ...

  3. 2018.11.08 UVA11021 Tribles(概率dp)

    传送门 概率dpdpdp简单题. 设f[i]f[i]f[i]表示第iii天的答案. 然后枚举ppp数组从fi−1f_{i-1}fi−1​转移过来就行了. 显然有fi=∑j=0npj∗(fi−1)jf_ ...

  4. springboot深入学习(一)-----springboot核心、配置文件加载、日志配置

    一.@SpringBootApplication @SpringBootApplication是spring boot的核心注解,源码如下: 相当于:@Configuration+@EnableAut ...

  5. Router types

    Inq-n. Flits are stored at the input of the router. Each input unit is connected to the switch by as ...

  6. CSS Sprites (CSS 精灵) 技术

    CSS Sprites在国内很多人叫css精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片就不会像以前那样一幅一幅地慢 ...

  7. openstack之虚拟机管理命令

    在控制节点上建hzb-openrc.sh export OS_PROJECT_DOMAIN_ID=default export OS_USER_DOMAIN_ID=default export OS_ ...

  8. MFC连接MySQL数据库方法

    MFC连接数据库的三种方法: 1.ODBC(开放式数据互联) 2.OLEDB与ADO 3.用mysql为C语言提供的接口

  9. Linux未安装上传下载的插件,怎么进行文件的上传下载

    首先连上服务: 然后Alt+p,打开SFTp窗口: 例如,我们今天要往tomcat的webappmu目录下上传一个文件: 先pwd,查看我们Linux上所处的目录:pwd 然后进入到tomcat的we ...

  10. POJ 3110 Jenny's First Exam (贪心)

    题意:告诉你n 个科目的考试日期,在考试当天不能复习,每一个科目的最早复习时间不能早于考试时间的t天,每一天你可以复习完一科,也只能复习一科,求最晚的复习时间!. 析:由于题目给定的时间都在1900 ...