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

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

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. vc项目中加载多个lib遇到的问题

    一个VC项目中 在网络加密 json解析等方面  加载了多个第三方库和文件 boost cryptpp rapidjson  mysql的连接池等等 在使用mysql++的时候 多次报错 LNK 20 ...

  2. 利用PHP脚本辅助MySQL数据库管理3-删除重复表索引

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

  3. Alpha 冲刺 (4/10)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助前后端接口的开发 测试项目运行的服务器环 ...

  4. libmysqlclient version

    You probably know that the version number of the libmysqlclient.so library has changed from .16 to . ...

  5. python使用Fabric模块实现自动化运维

    简介:Fabric是基于Python实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括:命令执行.文件上传.下载及完整 ...

  6. 将爬取的网页数据保存到数据库时报错不能提交JPA,Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\xB6 \xE2...' for column 'content' at row 1

    错误原因:我们可以看到错误提示中的字符0xF0 0x9F 0x98 0x84 ,这对应UTF-8编码格式中的4字节编码(UTF-8编码规范).正常的汉字一般不会超过3个字节,为什么为出现4个字节呢?实 ...

  7. 2019.01.13 bzoj4538: [Hnoi2016]网络(树链剖分)

    传送门 树链剖分一眼题. 题意简述: 给定一棵树,有三种操作: 加入一条路径 删除一条已加入的路径 询问不过一个点x的路径的最大值. 思路: 直接树链剖分维护答案. 因为询问的事不过点xxx的最大值, ...

  8. c# 数据表DataTable给devexpress的gridControl提供数据源

    C# DataTable 详解 参考:https://www.cnblogs.com/Sandon/p/5175829.html http://blog.csdn.net/singgel/articl ...

  9. IntellJ IDEA 对于 Spring Boot2.0.2 配置文件application.properties 配置

    1.指定文件名称: 打开IDEA编辑位置: 找到如图位置: 点开后方设置 设置输入如下内容:(默认的配置文件名字可以使用--spring.config.name来指定,只需要指定文件的名字,文件扩展名 ...

  10. HDU 2147 kiki's game (奇偶博弈)

    题意:给定一个 n * m 的格子,从右上角(1, m) 开始每个玩家只能从向下,向左,或者向左下走,谁不能走,谁输. 析:自己做出来,看了网上的几个博客,好像都没说为什么是只有全奇的情况才会输,个人 ...