C#通过字符串名称来调用对应字符串名称的方法
前段时间在一个项目中,在一个地方要将函数所在类中的方法都调用一遍,但是否调用要通过配置文件中的内容决定。所以为了减少代码量,在网上查了相关信息,终于成功的将其应用到了项目中,我在这里将我做的一个简单例子提供给大家,便于大家方便下载和理解。
主要用到了反射的一个特性,主要代码如下:
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#通过字符串名称来调用对应字符串名称的方法的更多相关文章
- dbda封装类(包括:返回二维数组、Ajax调用返回字符串、Ajax调用返回JSON)
<?php class DBDA { public $host = "localhost"; public $uid = "root"; public $ ...
- delphi不同版本字符串类型的演化(要支持基于firemonkey的app调用,字符串最好使用olevariant类型)
string,DELPHI2009以前的版本string=ansistring,一个字符占一个字节,DELPHI2009及以上版本string=unicodestring,一个字符占二个字节. cha ...
- python中通过字符串名来调用函数
强调:eval()函数功能虽然强大,但是也很危险,这个方法需要慎重使用. 利用python中的内置函数 eval() ,函数说明: def eval(*args, **kwargs): # real ...
- javascrit中“字符串为什么可以调用成员”
<script> var title = "this is title"; console.log(title.substr(0,5)); //字符串为什么可以调用 ...
- 【php 之根据函数名称动态调用该函数】
解释函数:call_user_func()以及函数call_user_func_array() 对于PHP程序员而言,函数是再熟悉不过的事物了,毕竟我们整天都在和PHP内置函数以及我们自定义的函数打交 ...
- 字符串 映射相应的 函数 字符串驱动技术—— MethodAddress , MethodName , ObjectInvoke
http://blog.csdn.net/qustdong/article/details/7267258 字符串驱动技术—— MethodAddress , MethodName , ObjectI ...
- Shell基础(四):字符串截取及切割、字符串初值的处理、基使用Shell数组、expect预期交互、使用正则表达式
一.字符串截取及切割 目标: 使用Shell完成各种Linux运维任务时,一旦涉及到判断.条件测试等相关操作时,往往需要对相关的命令输出进行过滤,提取出符合要求的字符串. 本案例要求熟悉字符串的常见处 ...
- Java字符串操作及与C#字符串操作的不同
每种语言都会有字符串的操作,因为字符串是我们平常开发使用频率最高的一种类型.今天我们来聊一下Java的字符串操作及在某些具体方法中与C#的不同,对于需要熟悉多种语言的人来说,作为一种参考.进行诫勉 首 ...
- Python全栈开发-执行字符串形式的语句和字符串形式的表达式方法(即exec和eval方法)
Python有时需要动态的创造Python代码,然后将其作为语句执行 或 作为表达式计算. exec用于执行存储在字符串中的Python代码. 1. 语句与表达式的区别:表达式是 某事,语句是 ...
随机推荐
- 我们最常见的UX设计交付成果有哪些?
以下内容由摹客团队翻译整理,仅供学习交流,摹客iDoc是支持智能标注和切图的产品协作设计神器. 有人会好奇,用户体验(UX)设计师每天都在做些什么呢?说实话,有很多事情!作为UX专家,需要将自己的设计 ...
- java基本例子
文件结构 D:\jp\jarDemo\IAmMainClass.java import iAmPackage.*; public class IAmMainClass { public static ...
- DB2 OLAP函数的使用
说起 DB2 在线分析处理,可以用很好很强大来形容.这项功能特别适用于各种统计查询,这些查询用通常的SQL很难实现,或者根本就无发实现.首先,我们从一个简单的例子开始,来一步一步揭开它神秘的面纱,请看 ...
- Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)
Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...
- windows server 2008 - 隐藏磁盘分区 (2)
二 创建策略并设置给指定用户 1 打开“组策略管理”(在这里创建策略) cmd下输入GPMC.MSC 打开组策略管理 随后在域上右键选择“在这个域中创建GPO并在此处链接”,输入名字“磁盘管理策略 ...
- Epson Pos Printer for .net
注:因发现各网站爬虫随意收集文章,故做此声明:版权归原作者(Leaf.Duan)所有,转载还请著名出处,谢谢 设备信息 Epson TM-T88IV Thermal Printer,爱普生 TM-T8 ...
- OneZero第三周第五次站立会议(2016.4.8)
1. 时间: 15:10--15:25 共计15分钟. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http ...
- Windows-universal-samples学习笔记系列五:Custom user interactions
Custom user interactions Basic input Complex inking Inking Low latency input Simple inking Touch key ...
- CSS-尺寸与边框
1.基础选择器的优先级 权值:标识当前选择器的重要程度,权值越大优先级越高. 元素选择器 1 类选择器 10 伪类选择器 10 ID选择器 100 内联样式 1000 选择器的权值加到一起,大的优先 ...
- win10 VMware ubuntu12.04 虚拟机不能上网【已解决】
参考 :链接. 本机环境:Ubuntu 12.04 无线上网(连接手机热点). 主机:Win 10. 步骤1:VMware安装运行后,默认会有3个虚拟网络,VMnet0,VMnet1,VMnet8. ...